int main()
{
int B = 1;
int x = rand()%10+1;
int x1 = rand()%10+1;
int A = 1;
while((B <= 5))
{
B++;
A++;
if(B == x)
{
return 0;
}
}
task(A) //The variable A passes in the range of values before the task function
A = -2;
return 0;
}
/*How can I use frama-c to get the range of A at task code if I want to get the range of A at task statement position instead of the range of A at the end of the program execution*/
如果要在任务语句位置获取A的范围而不是在程序执行结束时获取A的范围,如何使用frama-c在任务代码处获取A的范围
答案 0 :(得分:2)
如果我很好地理解了您的问题,那么您想知道在特定声明中A
的变化间隔。我假设您依赖Eva插件,因为它是Eva通常提供的那种信息(至少如果我很好地理解“而不是在程序执行结束时使用A的范围”) )。
有两种可能性。第一个是使用Eva的编程API,即Db.Value
模块。这需要了解OCaml并阅读HTML Reporting Dashboard,但这是访问信息的最灵活,最稳定的方法。简而言之,Db.Value.get_state
顾名思义,将返回运行Eva分析器后计算出的抽象状态,以参数作为语句,而Db.Value.eval_expr
则将给出抽象状态和一个表达式,计算相应状态下表达式的抽象值。
第二种可能性是使用Frama_C_show_each_*
系列内置函数:每当Eva遇到一个以Frama_C_show_each_
开头的函数时,它将在标准输出上打印参数的抽象值赋予当前抽象状态下的函数。因此,在调用Frama_C_show_each_A(A);
之前添加task(A)
会给您frama-c -eva test.i
等
[eva] test.i:19: Frama_C_show_each_A: [1..2147483647]
请注意,我已经修改了您的代码,以使其可以在Frama-C中正常运行:
extern int rand(void);
和extern void task(int);
task(A)
请确保您提供Frama-C developer manual,这使得它们非常容易回答