关键思想
对于给定的程序,希望可以自动生成一组测试用例,效率高,且测试用例满足一定的性质。
主要原理
通过分析程序来得到某段代码区域执行的输入。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器得到触发目标代码的具体值。并且在分析程序时,使用的是符号值作为输入(而不是具体的值)。
执行框架
实例
void foo(int a, int b){
int x = 1, y = 0;
if(a != 0){
y = 3+x;
if(b == 0)
x = 2*(a+b);
}
assert(x-y != 0);
}
假设要检查这一段代码中的assert( x - y != 0 )是否有用,也就是需要判断x-y ?= 0 所以此时的路径约束条件为 x - y == 0
- a == 0情况,因为a == 0,所以x - y == 0是不成立的,所以为UNSAT
- a != 0情况,x = 1, y = 3 + 1 = 4。
2.1 b != 0时,a != 0,b != 0,x = 1,y = 4,所以x - y == 0不成立,所以为UNSAT。
2.2 b == 0时,x = 2a ,y = 4,所以x - y = 2a - 4,当a=2时等于0,所以为SAT,模型为[ a = 2,b = 0 ]
然后将模型[ a = 2,b = 0 ]代会源程序中运行,发现的确 x - y == 0。