python中字符串函数的用法,编写程序,要求输入一个字符串,然后将用python语言
0x 1手动代码插装和编译成中间代码编译好KLEE后,可以通过测试一些简单的程序开始使用KLEE。如果您有以下代码:
int get_sign(int x) {if (x==0)返回0;if(x ^ 0)返回-1;否则返回1;} KLEE通过在源代码级别对变量进行追溯,对源代码中的变量进行了符号化。变量用klee.h头文件中声明的klee_make_symbolic函数来符号化(这个函数只声明了没有定义,它的语义是通过klee中的固有函数来实现的)。为了测试上面的get_sign函数,需要将变量X标记为符号变量。通过构造一个main函数调用get_sign函数,在main函数中传递一个符号参数给get_sign,就可以完成代码的构造了。主要函数的构造如下:
int main(){ int a;klee_make_symbolic(a,sizeof(a), a );返回get _ sign(a);}整个源代码已经写在source _ to _ klee/example/get _ sign目录下的get_sign.c文件中。KLEE虽然插装是在源代码级别,但是符号执行的分析过程是在LLVM IR级别完成的。所以,首先你需要把源代码编译成LLVM IR的二进制格式,也就是,bc文件。按如下方式编译该命令:
叮当-9 -I././include-emit-llvm-c-g-O0-Xclang-disable-O0-optnone-fno-discard-value-names get _ sign . c
-I …/…/include选项是查找klee/klee.h头文件包含的目录。-g选项是让clang在编译时保留调试信息。-O0 -Xclang -disable-O0-optnone选项是为了保证Klee可以优化生成的中间代码。-fno-discard-value-names选项是为了在生成文本IR时保留源代码中某些变量的命名方法,使其更易于阅读。
0xRun KLEE。运行上面编译好的命令后,当前目录下会生成get_sign.bc文件,作为KLEE的输入。同时,为了打印出符号执行时所解释的指令信息,可将以下选项添加到运行配置中:
-debug-print-instructions=all:stderr/home/Nino/klee _ env/klee-2.2/examples/get _ sign/get _ sign . BC
运行KLEE,您可以在控制台上看到以下输出:
在分析中间的每一条指令之前,会把与指令相关的一些信息打印出来。在分析结束时,会打印出三条黄色语句。从这些信息中,我们可以知道KLEE总共分析了33条指令。get_sign函数中有三条路径,每条路径KLEE生成一个测试用例。对于一些大型程序,KLEE可能无法完成每一条路径的探索,这主要是受时间限制和内存大小的限制。在这种情况下,KLEE还会给出这些路径在被探索之前被中断的数量。同时,每执行一次KLEE,当前目录下就会生成一个klee-out-N的目录,里面记录了第n次执行的所有信息。例如,对于上面提到的第0次执行,我们可以检查其目录中的内容:
assembly.ll文件是LLVM IR可读格式的文件。
Info记录了这次分析的一些基本信息,包括分析开始时间,搜索策略等等。
三个。ktest后缀文件是生成的测试用例信息。
0x查看生成的测试用例文件。ktest后缀是生成的测试用例数据,是二进制文件,不能直接查看其内容。通过KLEE提供的ktest-tool工具,可以查看其内容如下:
可以发现,对于每个测试用例,KLEE都报告了调用程序时使用的参数(在上面的例子中,只使用了它自己)、符号对象的数量、符号对象的名称和符号对象的值。其中,符号对象的值以几种格式给出。注意数据的数据格式,低位在左边,高位在右边。
0x4运行生成的测试用例,虽然我们可以通过手动修改源代码来运行我们的测试用例(这太麻烦了!),KLEE仍然提供了一个复制库,允许我们自动运行生成的测试用例。为了使用它,我们只需要在编译我们的源代码时链接共享库libkleeRuntest,然后指定环境变量KTEST_FILE指向对应的。ktest测试用例。操作如下所示:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。