首先进入目录:
cd klee_src/examples/get_sign
可以注意下这个例子中是如何make symbolic的:
int main() {
int a;
klee_make_symbolic(&a, sizeof(a), "a");
return get_sign(a);
}
然后编译到LLVM的字节码:
clang -I ../../include -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone get_sign.c
-I:保证可以找到klee/klee.h
-g:可以看到debug信息
-disable-O0-optnone 传递给KLEE的位码不应该被优化,因为我们手工为KLEE选择了正确的优化,可以通过KLEE的--optimize选项启用。而在本例中应该使用-O0 -Xclang -disable-O0-optnon
klee get_sign.bc
出现下图界面:
说明klee生成了三条测试路径,每条路径有一个测试用例。且klee生成了输出文件夹klee-out0N.
如果我们想查看测试用例,可以按照下面指令进行:
ls klee-last
然后用klee-tools查看测试用例:
ktest-tool klee-last/test000001.ktest
走到这一步差不多就学会了怎么用klee自动生成测试用例了。但是官网的tutorial还给了一个replay library可以简单地用一个调用覆盖掉klee_make_symbolic。只要用动态库libkleeRuntest链接一下就可以了。
但是我走到这一步有报错:
然后参考了这个教程(13条消息) KLEE学习——实例1_ChaosLee_的博客-CSDN博客
原来是我的路径设置有问题,不可以直接
export LD_LIBRARY_PATH=path-to-klee-build-dir/lib/:$LD_LIBRARY_PATH
#这是错的!!!
这里的path-to-klee-build-dir是要具体的你的build地址,一般默认都是/home/klee/klee_build,所以要输入的是:
export LD_LIBRARY_PATH=/home/klee/klee_build/lib/:$LD_LIBRARY_PATH
gcc -I …/…/include -L /home/klee/klee_build/lib/ get_sign.c -lkleeRuntest
然后就欧克啦!然后可以看到第一次a=0时候返回值为0,第二次a=16843009返回值为1;第三次a=-2147483648,返回值为-1(这里转换到了0-255范围,因此为255)。
然后我们的tutorial 1就圆满结束了!