使用KLEE生成高代码覆盖率的测试用例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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时的路径得来)