符号执行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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值