问题已经提交github:https://github.com/klee/klee/issues/650

在一个对命令行参数进行建模的符号执行过程中,添加optimize选项与不添加optimize选项,其执行结果完全不同。示例代码test5.c如下:

#include <stdio.h> //test5.c
#include <string.h>
#include <stdlib.h> int main(int argc, char* argv[]) {
//int result = argc > 1 ? atoi(argv[1]) : 0;
// printf("result:%d\n",result);
if (argc==) return -;
if (argv[][] == '')
{
return ;
}
else return ;
}
clang -I /home/klee/xiaojiework/klee/include/ -emit-llvm -c -g test5.c
klee --optimize --posix-runtime test5.bc -sym-args 0 1 3
或者
klee --optimize --posix-runtime test5.bc -sym-arg 3

我们分别看一下输出的结果:

对于第二种情况,由于已经限制必须有一个参数,所以,相比于第一种情况,就是减少了一条路径。

我们分别查看两种情况的测试用例的情况:

第一种情况:

klee@ubuntu:~/kleeexperiment/modeltest$ ktest-tool klee-last/test000001.ktest
ktest file : 'klee-last/test000001.ktest'
args : ['test5.bc', '-sym-args', '0', '1', '3']
num objects: 2
object 0: name: 'n_args'
object 0: size: 4
object 0: data: '\x00\x00\x00\x00'
object 1: name: 'model_version'
object 1: size: 4
object 1: data: '\x01\x00\x00\x00'
klee@ubuntu:~/kleeexperiment/modeltest$ ktest-tool klee-last/test000002.ktest
ktest file : 'klee-last/test000002.ktest'
args : ['test5.bc', '-sym-args', '0', '1', '3']
num objects: 3
object 0: name: 'n_args'
object 0: size: 4
object 0: data: '\x01\x00\x00\x00'
object 1: name: 'arg0'
object 1: size: 4
object 1: data: '\x00\x00\x00\x00'
object 2: name: 'model_version'
object 2: size: 4
object 2: data: '\x01\x00\x00\x00'

两个测试用例执行重现的输出结果:(test5与前述test5.bc不一样,前述的是llvm生成的供klee符号执行的字节码,这里重现时使用的test5是gcc test5.c -o test5,即本地可执行代码。)

klee@ubuntu:~/kleeexperiment/modeltest$ klee-replay ./test5 klee-last/test000001.ktest
klee-replay: TEST CASE: klee-last/test000001.ktest
klee-replay: ARGS: "./test5"
klee-replay: EXIT STATUS: ABNORMAL 255 (0 seconds)
klee@ubuntu:~/kleeexperiment/modeltest$ klee-replay ./test5 klee-last/test000002.ktest
klee-replay: TEST CASE: klee-last/test000002.ktest
klee-replay: ARGS: "./test5" ""
klee-replay: EXIT STATUS: NORMAL (0 seconds)

第二种情况:

klee@ubuntu:~/kleeexperiment/modeltest$ ktest-tool klee-last/test000001.ktestktest file : 'klee-last/test000001.ktest'
args : ['test5.bc', '-sym-arg', '3']
num objects: 2
object 0: name: 'arg0'
object 0: size: 4
object 0: data: '\x00\x00\x00\x00'
object 1: name: 'model_version'
object 1: size: 4
object 1: data: '\x01\x00\x00\x00'

测试用例执行重现的输出结果:

klee@ubuntu:~/kleeexperiment/modeltest$ klee-replay ./test5 klee-last/test000001.ktest
klee-replay: TEST CASE: klee-last/test000001.ktest
klee-replay: ARGS: "./test5" ""
klee-replay: EXIT STATUS: NORMAL (0 seconds)

可以看到,都没有覆盖下面这个分支:(注明echo $?显示的是255,其实就是-1)

if (argv[1][0] == '1')

我一开始以为是warning中的malloc没有建模,导致出现这种情况,所以,添加了--libc=uclibc选项。为了简化分析,我将代码改为如下,脚本改为如下:结果发现,仍然不能正确覆盖该路径。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
if (argv[1][0] == '1')
{
return 10;
}
else return 100;
}

脚本:

clang -I /home/klee/xiaojiework/klee/include/ -emit-llvm -c -g test5.c
klee --optimize --posix-runtime --libc=uclibc test5.bc -sym-arg 3
gcc test5.c -o test5
klee-replay ./test5 klee-last/test000001.ktest

仍然没有覆盖到下面这个分支。

if (argv[1][0] == '1')

测试用例重新执行程序的结果是:

又是在误打误撞中,我去掉了klee符号执行时的--optimize选项

脚本是:

klee --posix-runtime --libc=uclibc test5.bc -sym-arg 3 

两个测试用例的执行重现结果:

可以看到,正确地覆盖了程序的两条路径。那么为什么一个optimize有这么大的区别呢?

klee错误汇报二:KLEE的optimize选项的一个困惑的更多相关文章

  1. KLEE错误汇报一:One phenomenon after the execution using klee

    https://github.com/klee/klee/issues/649#issuecomment-300424204 Hi, all,      If you write test.c wit ...

  2. SQL2008 'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。

    'OFFSET' 附近有语法错误.在 FETCH 语句中选项 NEXT 的用法无效. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出 ...

  3. 'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。

    在使用asp.net core的时候,采用take().skip()分页的时候报如下错误: SqlException: 'OFFSET' 附近有语法错误. 在 FETCH 语句中选项 NEXT 的用法 ...

  4. django “如何”系列7:错误汇报

    当你正在运行一个公共的站点的时候,你应该关掉DEBUG设置.这将使你的服务器运行的更快,同时也能预防别有用心的用户从你的错误页面看到你应用的一些详细配置信息.然而,当debug为false的时候,你将 ...

  5. .ner core InvalidOperationException: Cannot find compilation library location for package 'xxx' 和 SqlException: 'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。问题

    原文地址:传送门 1.InvalidOperationException: Cannot find compilation library location for package 'xxx'问题: ...

  6. Tomcat运行错误示例二

    Tomcat运行错误示例二 当遇到这种错误时,一般是构建路径的问题,按步骤来就好.如图: 点击---->库---->Add Library---->下一步---->选择tomc ...

  7. 运行ABP(asp.net core 3.X+Vue)提示'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无效。

    创建ASP.NET Boilerplate,还原数据库和启动客户端 这里就略过,具体参考 ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) ASP.NET Boilerpl ...

  8. 二、Django用Eclipse编写一个登录界面

    一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...

  9. 错误 NETSDK1068: 框架依赖型应用程序主机需要一个至少 “netcoreapp2.1” 的目标框架

    错误 NETSDK1068: 框架依赖型应用程序主机需要一个至少 “netcoreapp2.1” 的目标框架 我有一个ASP.NET Core 2网站应用程序,编译运行都没有问题,但是发布时却出了错, ...

随机推荐

  1. 网络编程- 解决黏包现象方案二之struct模块(七)

    上面利用struct模块与方案一比较,减少一次发送和接收请求,因为方案一无法知道client端发送内容的长度到底有多长需要和接收OK.多一次请求防止黏包,减少网络延迟

  2. Windows USB 编程

    GUID #include <initguid.h> // For DEFINE_GUID // Device Interface GUID.DEFINE_GUID(GUID_DEVINT ...

  3. 初识iVew table表属性

    <template> <Table :row-class-name="rowClassName" :columns="columns1" :d ...

  4. (转)搭建企业内部yum仓库(centos6+centos7+epel源)

    搭建企业内部yum仓库(centos6+centos7+epel源) 原文:https://www.cnblogs.com/nulige/p/6081192.html https://www.linu ...

  5. Oracle 多行、多列子查询

    本文使用到的是oracle数据库scott方案所带的表,scott是oracle数据库自带的方案,使用前请确保其解锁 一.多行子查询 多行子查询子查询是嵌入在其他Sql语句中的select语句,Ora ...

  6. JS的正则表达式 - RegExp

    RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 正则表达式的创建方式 1.文字格式,使用方法如下: /pattern/flags  (即:/模式/标记) 2 ...

  7. MacOS系统下的图形化工具

    MacOS系统下的图形化工具 MacOS系统下安装了Git后,发现如果Git中有中文文档操作还是比较麻烦(需要输入中文的文件名).图形化对Git的操作还是相对于方便一些.所以准备找一个图形化的工具. ...

  8. 安装和部署Jenkins

    安装和部署Jenkins 环境 操作系统:ubuntu 14.04.4 LTS 下载Jenkins wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/ ...

  9. 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列

    网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...

  10. spring自定义标签之 规范定义XSD

    引言: spring的配置文件中,一切的标签都是spring定义好的.<bean/>等等,有了定义的规范,才能让用户填写的正常可用.想写自定义标签,但首先需要了解XML Schema De ...