以下是我的例子:
int in;
int sum(int n){
int log_input = n;
int log_global = in;
return 0;
}
int main(){
int n = Frama_C_interval(-10, 10);
in = n;
if (n > 0){
sum(n + 4);
}
return 0;
}
我想要做的是在main中初始化时找到输入变量n的范围,从而达到函数sum。此示例中的正确范围是[1,10]。
在示例中,我想将原始输入“保存”在全局值 中,并通过将其分配给变量 log_global 从而发现导致达到功能的原始输入。 在此示例上运行frama-c时,我们得到log_input的范围是[5,14],log_global的范围是[-10,10]。 我理解为什么会发生这种情况 - 中的值设置在 main 的开头,并且不受 n 的进一步操作的影响。
我想知道在frama-c中是否有一种简单的方法可以改变它?也许是对frama-c代码的一个简单修改?
我有一个不相关的想法是在main中操纵if语句:
if (in > 0){
sum(in + 4);
}
我使用全局变量而不是 n 。这确实产生了正确的范围,但是这种解决方案不能很好地扩展到更复杂的函数和更深的调用堆栈。
答案 0 :(得分:3)
这是一个可能的解决方案。使用内置Frama_C_interval_split
和适当的-slevel N
(此处,至少为N=21
)。函数sum
将被检查N次,每个可能的N值一个,结果将是精确的
int n = Frama_C_interval_split(-10, 10);
结果:
[value] Values at end of function sum:
log_input ∈ [5..14]
log_global ∈ [1..10]
__retres ∈ {0}
(基本上,这相当于进行手动模型检查,因此对于较大的N值,性能不会很好。)