frama-c是否可以在特定程序代码之前获取变量范围

时间:2018-12-03 08:03:03

标签: c frama-c

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的范围

1 个答案:

答案 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,这使得它们非常容易回答