符号执行Symbolic Execution

关键思想

  对于给定的程序,希望可以自动生成一组测试用例,效率高,且测试用例满足一定的性质。

主要原理

  通过分析程序来得到某段代码区域执行的输入。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器得到触发目标代码的具体值。并且在分析程序时,使用的是符号值作为输入(而不是具体的值)。

执行框架

符号执行框架

实例

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

符号执行实例

  1. a == 0情况,因为a == 0,所以x - y == 0是不成立的,所以为UNSAT
  2. 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。

猜你喜欢

转载自blog.csdn.net/qq_41084082/article/details/123289786
今日推荐