表达的反向分析

时间:2015-04-23 07:13:51

标签: c algorithm static-analysis

假设我在C中有以下代码段。

i = j = k = 1;

j = (i++) + (++k);

result = i + j + k; //POI
//Expected result = 7

在这里,我希望通过反向分析找到result的值。当我执行反向分析时,我将按顺序查看以下表达式。

j = (i++) + (++k);
++k;
i++;
i = j = k = 1;
j = k = 1;
k = 1;

在向后分析期间,只要适用,我将用相应的表达式替换每个变量。但我很困惑如何处理增量/减量操作。

我目前的策略会产生以下结果

result = i + j + k

//after j = i++ + ++k
result = (i+(i+(k+1)))+k

//after ++k
result = (i+(i+((k+1)+1)))+(k+1)

//after i++
result = ((i+1)+((i+1)+((k+1)+1)))+(k+1)

//after i = j = k = 1
result = ((1+1)+((1+1)+((k+1)+1)))+(k+1)

//after k = 1
result = (((1+1)+((1+1)+((1+1)+1)))+(1+1))

//Simplifying
result = 9

当然不是真的。

任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:2)

我认为应该更像这样

result = i + j + k

//after j = X + Y      // You didn't analyse ++k and i++ yet 
result = i+(X+Y)+k    

//after Y = ++k
result = (i+(X+(k+1))+(k+1)

//after X = i++
result = ((i+1)+(i+(k+1))+(k+1)

//after i = j = k = 1
result = ((1+1)+(1+(k+1))+(k+1)

//after k = 1
result = ((1+1)+(1+(1+1))+(1+1)

//Simplifying
result = 7

答案 1 :(得分:0)

这里需要注意的是i ++在评估之后会增加,而不是之前。

i=j=k=1
++k  //happens before expression
//k=2,i=j=1
j = k + i 
//k=2,i=1,j=3
i++ //happens after expression
//k=2,i=2,j=3
result = i+ j + k
//result = 7

i的评估之前,您的错误正在增加j,然后获得j = 4,而不是j = 3

如果你想向后分析,那就是

result = i + j + k
i = i+1 = 1 + 1
//result = (1+1) + j + k
j = i + k 
k = k+1 = 1+1
//j = 1 + (1+1) 
//result = (1+1) + (1+(1+1)) + (1+1)

答案 2 :(得分:0)

我建议您首先将语句分解为初级语句,就像编译器一样。例如,使用Frama-C来分解语句会产生类似的结果:

k = 1;
j = k;
i = j;
tmp = i;
i ++;
k ++;
j = tmp + k;
result = (i + j) + k;

然后进行分析要容易得多。 考虑从底部开始的序列:

  // 1 + 1 + 1 + 1 + 1 + 1 + 1
k = 1;
  // k + 1 + k + k + 1 + k + 1
j = k;
  // j + 1 + j + k + 1 + k + 1
i = j;
  // i + 1 + i + k + 1 + k + 1
tmp = i;
  // i + 1 + tmp + k + 1 + k + 1
i ++;
  // i + tmp + k + 1 + k + 1
k ++;
  // i + tmp + k + k
j = tmp + k;
  // i + j + k
result = (i + j) + k;
  // result ?

这为你提供了7个预期。