为什么在Frama-c的Eva插件正确找到断言的反例时返回未知

时间:2019-02-14 14:56:25

标签: frama-c

我正在尝试在函数内插入一个断言。这是我所做的:

void foo(int a) {
    //@ assert a == 1;
}

void main() {
   foo(1);
   foo(2);
}

我希望得到一个无效的结果,但是Frama-C返回一个未知的结果,同时它可以为调用堆栈提供反例。

这是我使用Frama-C运行示例时的屏幕截图:

Screenshot of the Frama-C GUI with the values per callstack computed by Eva

1 个答案:

答案 0 :(得分:3)

Eva指示该状态为未知,因为它已观察到一个调用堆栈,其中该声明有效,而另一个声明无效。但是,由于该插件执行过高的逼近度(嗯,不是在这里,因为您的程序很琐碎,但在一般情况下会这样),因此无法确保两者都可以在具体的执行中发生:由于Eva所使用的抽象所无法达到的条件,在具体的世界中可能无法到达分支的任何一个(验证断言的分支或使断言无效的分支)。因此,包含所有可能性的唯一声音可能性就是在此处放置Unknown状态。

如果您注释掉foo(1)调用,您也会看到同样的问题。然后,Eva将报告断言无效,但仅提供了确实可以达到的断言

最后,这种注释确实是您通常首先要研究的注释(与“普通”未知状态的注释相对),在新版本的Frama-C(从v17.0开始)中,您还有一个附加面板Red Alarms,其中列出了至少一个调用堆栈无效的属性。