我正在尝试使用Frama-c
检查我拥有的C函数的某些属性。该函数非常大,我需要检查一些中间变量。 (我正在遵循this和this手册)
我的程序具有以下结构:
我需要检查的变量是在程序中多个位置分配的值,具体取决于程序的路径。
my_function(){
intermediate var 1=xx;
//@assert var 1>some_value;
intermediate var 2=yy;
return var 4;
intermediate var 1=xx;
//@assert var 1>some_value;
return var 4;
intermediate var 2=xx;
intermediate var 1=yy;
//@assert var 1>some_value;
return var 4;
}
说明:我需要检查与var 1,var 2和var 4相关的某些属性。我尝试了2种方法。
问题是Frama-C仅检查第一个断言。
在开头使用注释。
/*@ requires \valid(var 1);
ensures var 1 > some_value;
*/
在这种情况下,Frama-C返回错误。
问题:如何检查属性以查找中间问题?有示例程序吗?
*我没有包含我的原始函数,因为它很长。
答案 0 :(得分:0)
正如Virgile所提到的,您的问题不是很清楚,但是我认为您正在尝试验证var1和var2的某些属性。 book提供了一些很好的示例,我认为以下内容可以为您提供帮助。
int abs(int val){
int res;
if(val < 0){
//@ assert val < 0 ;
res = - val;
//@ assert \at(val, Pre) >= 0 ==> res == val && \at(val, Pre) < 0 ==> res == -val;
} else {
//@ assert !(val < 0) ;
res = val;
//@ assert \at(val, Pre) >= 0 ==> res == val && \at(val, Pre) < 0 ==> res == -val;
}
return res;
}
在这种情况下,作者使用了Hoare三元组的概念,您可以通过断言某个属性对属性的要求(前提条件)来检查(声明)某个属性,并在执行相应的语句后检查该属性是否成立。
希望这会有所帮助。