KLEE: 某用symbolic execution的方法来产生能够遍历不同程序路径的test cases的工具,可以找到bug。

编译

如果编译KLEE的时候说:

   Bytecode libraries require LLVM capable compiler but none is available ****

那就是说,你的LLVM在configure的时候,没找到llvm-gcc。 基本上这是因为你没在编LLVM之前装llvm-gcc,或者装完了没加到path里去。 其实不加到path也可以,给configure加个参数,configure就不用自己到path里找llvm-gcc了。 加完了重新configure一下llvm,再编译安装就可以了。

重现

重现的时候可能碰到这个问题:

   islower.c:(.text+0x3f): undefined reference to `klee_make_symbolic'

虽然你在链接里面已经加了libkleeRuntest.a。 如果你把它换成这个.a里那个唯一的.o,那就换个错误:

   In function `klee_make_symbolic':
   klee/runtime/Runtest/intrinsics.c:76: undefined reference to `kTest_fromFile'

于是如果你再把KTest.o加进来,那就可以编译过……

问题在于:

1. 其实还依赖另一个.a,libkleeBasic.a

2. 顺序问题

我不知道为啥会有这个问题,或许以后会了解。反正现在知道的是,如果你用了.a的东西,你就要把.a放到后面。 所以要这么编译:

   gcc islower.c klee/lib/libkleeRuntest.a klee/lib/libkleeBasic.a  -Iklee/include/

然后就没问题了……