在这篇博客中,我们将展示如何使用 KLEE 自动地为一些整数相关的小实例(用 C 语言编写)生成测试用例,在下篇博客中,我们将用 KLEE 来测试一段二分查找算法的代码,生成测试用例。

符号执行是不同于实际运行程序的,在符号执行中,我们跟踪的不是变量的实际值,而是其“符号值”和对这些值的操作。所以,对于如下这段函数代码:

int many_math_operations(int x) {int result = x * 2;result += 5;result /= -3;result *= (result+1);return result;
}

如果我们将变量 x 的值看成是一个未知的 X,则这个函数的结果是:

符号执行也处理一些条件语句(if,while,do-while,for)等。例如:

int function_with_if(int x) {if (x > 0) {return 10 / x;} else {return 10 / (x + 1);}
}

在上面的函数中,符号执行尝试去覆盖到所有可能的路径。对于每条路径,它都会找到满足路径条件的输入并且根据符号表达式产生输出。

对于 X > 0 的情况,输出将是 10/X(接下来都使用大写字母来表示符号值)。
对于 !X > 0)的情况,输出将会是 10/(X+1)。

你能找到上述函数可能的错误码??KLEE 呢??


1、首先我们创建一个包含上述函数的本地文件(source_to_klee/examples/function_with_if/function_with_if.c)

#include <klee/klee.h>
#include <stdio.h>int function_with_if(int x) {printf("input: %d\n", x);if (x > 0) {return 10 / x;} else {return 10 / (x + 1);}
}int main() {int x;klee_make_symbolic(&x, sizeof(x), "x");int result = function_with_if(x);printf("result = %d\n", result);return 1;
}

main 函数中表示变量 x 应该视为符号值。

2、编译成 LLVM 字节码
clang -I source_to_klee/include/ -emit-llvm -c -g -O0 -Xclang -disable-O0-optnone function_with_if.c

3、运行 KLEE
klee -external-calls=all source_to_klee/examples/function_with_if/function_with_if.bc
通过命令行选项 -external-calls=all 可以让 KLEE 在遇到 printf 函数调用的时候状态不会终结。

KLEE 找到了一个除零错误!!!

4、让我们看看生成的测试用例:
ktest-tool klee-out-0/test000001.ktest

可以看到在这个测试用例中,变量 x 的值是 int 型的 -1。同样你也可以查看第二个和第三个测试用例,你将看到被选择的输入分别是 0 和 16777216。KLEE 选择这些值是非常有用的,因为他们可以有效的检查边界情况。

5、让我们用不同的输入运行程序,观察程序的行为:
根据第一篇博文中类似的方式复现这个测试用例,如下:

可以看到产生了异常,程序被非正常终止。

同时复现第二个和第三个测试用例,结果如上。

在这篇博文中,我们使用 KLEE 分析了一个非常简单的示例。在下篇博客中,我们将使用 KLEE 自动地分析二分查找的小示例,生成测试用例。


[注]:在 KLEE 输出的文件夹中,发现对于第一个除零错误的测试用例,还生成了一个 .kquery 后缀文件和一个 .div.err 后缀文件,让我们看看里面都有啥。
.div.err 后缀文件(提供了缺陷类型,所在文件名和行数,调用栈信息):

.kquery 后缀文件(Kquery 格式的查询表达式):

KLEE 使用(二)------ 怎么自动地生成测试用例?相关推荐

  1. android 自动重启测试,检测Android系统重启并生成测试用例的方法与流程

    本发明涉及软件技术领域,特别是一种检测Android系统重启并生成测试用例的方法. 背景技术: 目前安卓智能设备的功能越来越多,例如安卓智能电视或安卓智能盒子等,而在不同功能间交叉操作有概率触发And ...

  2. python 文案自动生成_Python自动化测试如何自动生成测试用例?

    原文作者:陈安妮annie1 原出处:简书 上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰,我们将立即处理. 传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言判断 ...

  3. 怎么自学python自动化测试-python自动化测试如何自动生成测试用例?

    传统的用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言判断是否和预期一致,写测试用例也占用了部分时间,加上版本迭代测试用例的维护成本也较高,于是基于无埋点的需求相结合来检测埋点,及时告警, ...

  4. python自动测试g_Python自动化测试如何自动生成测试用例?

    原文作者:陈安妮annie1 原出处:简书 上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰,我们将立即处理.传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言判断是 ...

  5. python 测试用例的无输入_如何为无参数方法自动生成测试用例?

    为了减少boiler-plate代码,我想出了在类测试仪中为所有无参数方法生成测试用例的想法.在 跑步时py.测试,它只识别静态编写的测试用例(测试a.测试b),而不识别使用setattr(Teste ...

  6. python自动化测试-Python自动化测试如何自动生成测试用例?

    今天, 陕西优就业 小优整理了一些技术类干货知识,学习软件测试的小伙伴,可以来看看,都是一些基础知识,希望能对你的学习有所帮助! 传统的测试用例需要测试或者开发人员将用户的操作用代码表示出来,通过断言 ...

  7. 二维码条形码生成打印软件C#源码,根据变量自动添加抬头

    二维码条形码生成打印软件C#源码,根据变量自动添加抬头,非常方便,工控朋友可以直接拿过去使用,完整源码 16100635774317133鲲鹏自动化

  8. 二维码WIFI自动连接生成格式

    http://mgz9057.blog.163.com/blog/static/31237253201519104039137/ 二维码WIFI自动连接生成格式 WIFI:T:WPA;S:MM;P:1 ...

  9. 如何在浏览器实现二维码流水号生成并实现自动打打印(上篇)

    如何在浏览器实现二维码流水号生成并实现自动打打印(上篇) (原创) 这编文章介绍如何在C/S架构的系统里,添加一个生成打印二维码 /条形码的页面,并业实现流水号自动打印的方法. 网页生成二维码 /条形 ...

最新文章

  1. 解决WINCE500中INTEL编译器无法完全卸载的问题
  2. cout的输出格式初探
  3. c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking)
  4. TensorFlow 笔记5--模型复用
  5. VTK:二次抽取用法实战
  6. Sentinel(二十五)之Sentinel Dashboard同步Apollo存储规则
  7. Bootstrap 分页导航的对齐方式
  8. 长沙优科软件开发有限公司招聘软件开发工程师
  9. AspNetPager 分页的详细用法(ASP.NET)
  10. Word文档中去除EndNote格式
  11. 孙子兵法始计篇读后感&心得(下)
  12. 稻盛和夫「活法」| 读书笔记系列01
  13. 赵小楼《天道》《遥远的救世主》深度解析(4)从肖亚文引申怎么看待随缘、惜缘、攀缘这三种缘?
  14. poj 1129 四色原理DFS
  15. CPU时钟周期和时钟频率
  16. BUUCTF:小明的保险箱
  17. 【Visual C++】游戏开发笔记二十五 最简化的DirectX开发环境的配置
  18. jdk-9.0.4安装与环境变量配置
  19. 小虎电商浏览器:如何利用店小秘助手上架产品到亚马逊?
  20. 红黑树简介及左旋、右旋、变色

热门文章

  1. yolov5s,yolov5m,yolov5l,yolov5face推理速度对比
  2. Python|分分分找数据
  3. Android手机得到信号强度信息
  4. 9/19 开发日记 打开截图工具,截pad图
  5. js中for循环嵌套
  6. Ubuntu删除文件命令
  7. 【信号】SIGCHLD信号
  8. 数学建模常见的一些方法【03插值算法】
  9. linux shell输出时间,Linux Shell输出格式化日期(转)
  10. hooks 使用dva_hooks 中使用dva