使用KLEE生成高代码覆盖率的测试用例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用KLEE生成高代码覆盖率的测试用例一、实验目的

本实验可以帮助学生了解动态符号执行工具KLEE的基本功能,,为进一步研究符号执行技术的理论与应用提供基础。

二、实验内容及环境

本实验展示如何利用klee对一个被测目标函数进行符号执行,覆盖全部路径,并生成测试用例的具体操作流程。

实验虚拟机为Ubuntu 16.04.1 LTS 64位操作系统。

三、klee安装

1.进入安装主页

klee网站http://klee.github.io/中有相关的安装方法,点击Use KLEE Docker image进入。如图1。

图1 安装主页

2.安装docker(ubuntu)

点击进入ubuntu版本的docker入口,如图2.

图2 安装入口

3.安装linux-image-extra-*包

①更新包管理器

sudo apt-get update

②安装命令包

sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

4.更新apt源

①更新包信息

一些准备工作,逐条输入指令即可,不再展开介绍。

sudo apt-get update

sudo apt-get install apt-transport-https ca-certificates

sudo apt-key adv \

--keyserver hkp://:80 \

--recv-keys 58118E89F3A912897C070ADBF76221572C52609D

②更新apt源

打开/etc/apt/sources.list.d/docker.list文件,没有就创建一个,里面加一句话,如下:

gedit/etc/apt/sources.list.d/docker.list 输入deb https:///repo ubuntu-xenial main并将文本保存。

③更新软件源

sudo apt-get update

④确定APT连接的是正确的仓库

apt-cache policy docker-engine

5.安装最新版本docker

①安装docker

sudo apt-get install docker-engine

②启动docker服务

sudo service docker start

③验证安装是否成功,若显示如图3所示,则安装成功。

sudodocker run hello-world

图3 docker安装成功

6.下载KlEE镜像

docker pull klee/klee

7.运行KLEE镜像

docker run --rm -ti --ulimit='stack=-1:-1' klee/klee

进入到klee操作界面,如图4:

图4 klee界面

退出命令则是:exit

四、实验步骤

1.选取目标函数

函数get_sign如图5所示:

图5 目标函数

2.对目标函数进行插装

对上述目标函数进行插装,得到源代码程序get_sign.c

打开/Home/klee/examples/get_sign中的get_sign.c,如图6所示:

图6 源代码程序

其中,klee_make_symbolic函数将某一个变量符号化。该函数需要三个参数:符号变量地址,符号变量占用内存字节,和它所采用的符号名称。

由于klee相关可执行文件在klee目录下,所以将get_sign.c放到/Home/klee目录下。

3.编译成LLVM中间语言

KLEE在LLVM中间语言字节码上进行操作。我们要使用clang -I ../../include -emit-llvm -c -g get_sign.c将源码get_sign.c编译成LLVM 中间语言,得到get_sign.bc文件。

命令如下:

clang -I ../../include -emit-llvm -c -g get_sign.c

-I是为了让编译器可以找到头文件

-g是为了增到调试信息到bitcode 文件中。

结果如图7:

图7 生成LLVM中间语言

4.klee进行符号执行

用klee对编译后得到的中间语言进行符号执行,命令如下:

kleeget_sign.bc

KLEE符号执行后的输出信息如图8所示:

图8 klee符号执行

我们选取的get_sign函数,有三条路径。程序分别在a为0,a大于0和a小于0时执行。KLEE将对所有三条路径进行探索,并且为每一条路径生成一个包含具体值而非符号值的测试用例。

5.查看生成的测试用例信息

每当命令klee执行一次(注:针对不同或相同的LLVM中间字节码执行),就会在当前目录下生成一个klee执行后的信息统计文件。并且有一个快捷方式klee-last,指向最新一次因klee执行而生成的目录klee-out-X。

在klee-last指向的目录中的文件如图9所示:

图9 klee-last目录

在klee执行信息目录下的以“.ktest”为后缀名的文件中,包含有klee产生的测试用例。在对get_sign函数进行符号执行以后,产生了三个测试用例,分别位于test000001.ktest,test000002.ktest,test000003.ktest文件中。在klee-last目录下用命令行键入如下命令:

ktest-tool --write-intsklee-last/test000001.ktest

显示test000001.ktest文件如图10所示:(该测试用例是执行x>0时的路径得来)

图10 test000001.ktest文件内容

更新命令,显示test000002.ktest文件如图11所示:(该测试用例是执行x=0时的路径得来)

相关文档
最新文档