kleekai,kleed
一、克利装置最后一次编辑是在2019年5月
参考http://klee.github.io/build-llvm60/.
1.安装相关依赖项
$ sudo apt-get install build-essential curl lib cap-dev gitcmake libncurses 5-dev python-minimal python-pip unzip libtcmalloc-minimal 4 lib Google-perf tools-dev 2。安装LLVM6.0
$ sudo apt-get install clang-6.0 LVM-6.0 LVM-6.0-dev LLVM-6.0-tools 3。安装定理证明器
(1)安装相关的依赖项
Suda pt-get install cmake bison flex libboost-all-dev Python perl zlib 1g-dev(2)install theory prover STP
$ git克隆https://github.com/stp/minisat.git$ CD minisat $ mkdir build $ CD build $ cmake-DSTATIC _ BINARIES=ON-DC make _ INSTALL _ PREFIX=/usr/local/./$ sudo make install $ cd././$ git clone https://github.com/stp/stp.git$ CD STP $ git check out tags/2 . 1 . 2 $ mkdir build $ CD build(3)共享STP库会导致KLEE出现问题,所以我们需要禁用它。
$ sudo cmake-d build _ shared _ libs:bool=off-den able _ python _ interface:bool=off.$ sudo make $ sudo make install $ cd.(4)最后,需要执行。
$ ulimit-s无限4。构建uclibc和POSIX环境模型
$ git clone https://github.com/klee/klee-uclibc.git $ CD klee-uclibc $。/configure-make-llvm-lib $ make-J2 $ CD.5.获取Google测试源代码并解压缩。
$ curl-ol https://github . com/Google/Google test/archive/release-1 . 7 . 0 . zip $ unzip release-1 . 7 . 0 . zip 6 .安装lit
$ pip安装文件7。去找克利
$ git clone https://github.com/klee/klee.git 8。配置KLEE
$ sudo apt-get install doxygen $ sudo cmake-den able _ solver _ STP=on-den able _ POSIX _ runtime=on-den able _ klee _ uclibc _ path=/your own path/E-uclibc-den able _ unit _ tests=on-DG test _ src _ dir=/your own path/Google test-release-1 . 7 . 0-dllvm _ config _ binary=/usr/lib/llvm-6.0/yiran ./
$ sudo make$ sudo make install II。KLEE的默认路径选择算法1。路径搜索算法综述
在实际程序中,循环、迭代和递归中有很多分支。符号执行会导致巨大的路径空间,不可能在可接受的时间范围内遍历所有程序路径。所以大多数情况下,人们会指定符号执行时间的最大值。为了覆盖更多语句,探索更多路径,提高在规定时间内发现缺陷的能力,选择合适的搜索策略非常重要。在符号执行中,搜索策略决定了程序状态空间中最终可以探索哪些路径,从而影响语句覆盖率和缺陷发现能力。(引自《复杂算术程序的符号执行搜索策略研究》)
KLEE中提供了四种路径搜索算法:
深度优先搜索
随机状态搜索
随机路径选择随机路径搜索
非均匀随机搜索(NURS)
随机路径选择随机路径搜索是KLEE默认的路径搜索算法(根据官网文档):随机路径搜索(Random Path Search,简称 RPS):该策略使用一棵二叉执行树来记录被测程序执行部分的信息。二叉树的叶节点是候选状态,内部节点是路径分叉点。
对于图中所示的符号执行树,RPS策略会删除探索过的路径,只保留候选状态信息,如下图所示。
当RPS策略用于状态选择时,它将从根节点开始,并且在每个路径分叉点都是相等的。
随机选择左右分支,直到到达叶节点,即选择对应的叶节点。
的状态。在探索执行树之前,如果接下来使用RPS策略,那么路径
深度越低,候选状态被选中的概率越高。一般来说,深度越小,状态
路径条件越简单,执行未覆盖语句的概率就越高。与RSS策略相比,
RPS可以避免分支爆炸的问题,但是和RSS策略一样,RPS可能会被复制。
生成相似的测试用例。
2.RPS路径搜索算法的源代码实现在2。三叶草
在KLEE/lib/Core/Searcher.cpp中实现了KLEE的路径搜索算法,其中我们关心的是默认的路径搜索算法,即RPS:
类RandomPathSearcher:public Searcher { Executor Executor;public:RandomPathSearcher(Executor _ Executor);~ RandomPathSearcher();执行状态select state();void更新(执行状态*当前,const STD:vectorExecutionState *添加的状态,const STD:vectorExecutionState *删除的状态);布尔空();void打印名称(llvm:raw _ ostream OS){ OS RandomPathSearcher \ n ;} };RandomPathSearcher:RandomPathSearcher(Executor _ Executor):Executor(_ Executor){ } RandomPathSearcher:~ RandomPathSearcher(){ }执行状态RandomPathSearcher:select state(){ unsigned flips=0,bits=0;PTree:Node * n=执行者。处理树根;而(!n-data) { if(!n-左){ n=n-右;} else if(!n-右){ n=n-左;} else { if(bits==0){ flips=therng。getint 32();位=32;} -位;n=(翻转(1位))?n-左:n-右;} } return * n-data;} voidRandomPathSearcher:update(执行状态*当前,const STD:vectorExecutionState *添加的状态,const STD:vectorExecutionState *删除的状态){ } bool RandomPathSearcher:empty(){返回执行器。各州。empty();} 以上就是三叶草的路径选择算法,大家可以通过对代码的修改来实现自己的算法。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。