我想知道是否可以使用 Frama-C 进行某种前向条件切片,并且我正在使用一些示例来了解如何实现这一点。
我有这个简单的例子,它似乎导致了一个不精确的切片,我不明白为什么。这是我要切片的功能:
int f(int a){
int x;
if(a == 0)
x = 0;
else if(a != 0)
x = 1;
return x;
}
如果我使用这个规范:
/*@ requires a == 0;
@ ensures \old(a) == a;
@ ensures \result == 0;
*/
然后 Frama-C 使用“f -slice-return”标准和 f 作为入口点返回以下切片(精确):
/*@ ensures \result ≡ 0; */
int f(void){
int x;
x = 0;
return x;
}
但是当使用这个规范时:
/*@ requires a != 0;
@ ensures \old(a) == a;
@ ensures \result == 1;
*/
然后所有指令(和注释)仍然存在(当我等待这个切片被返回时:
/*@ ensures \result ≡ 1; */
int f(void){
int x;
x = 1;
return x;
}
)
在最后一种情况下,切片是否不精确?在这种情况下,可能是什么原因?
问候,
罗曼
编辑:我写了“else if(a != 0) ...”但问题仍然存在于“else ...”