框架断言

Frama-c Assertion

最近我一直在使用frama-c,我遇到了一个有点令人困惑的问题。

我在frama-c中写了一个非常简单的程序是这样的:

void main(void)
{
    int a = 3;
    int b = 4;
    /*@ assert a == b;*/
}

我希望 frama-c 说断言无效,在 GUI 中用红色圆点表示,但是 frama-c表示根据值(根据假设)断言无效,由橙红色项目符号显示。

我的问题是为什么 frama-c 说这个断言在假设下是无效的?

可能的假设是什么?

我问这个是因为我的程序非常简单,我在我的程序中找不到任何与断言相关的假设或依赖项,我想 frama-c 应该只是说断言无效.

如果您 graphviz 配置了 Frama-C 安装(即在配置 Frama-C 时可用,手动或通过 opam),您可以双击 属性 在属性面板中,并且 window 应该打开 属性 的以下依赖关系图:

在里面,我们可以看到一个属性使用的所有假设,所以我们看到提到的"under hypotheses"是断言的可达性。 Eva(value插件)计算的是可达状态的过度逼近,所以它不能证明给定的状态是可达的,只能证明它是不可达.

目前,唯一可以明确证明可达性状态的插件是PathCrawler。但是,在实践中这很少成为问题。

查看在假设下证明的 属性 的依赖关系的另一种方法是在命令行上使用 Report 插件:

$ frama-c -val c.c -then -report

[report] Computing properties status...

--------------------------------------------------------------------------------
--- Properties of Function 'main'
--------------------------------------------------------------------------------

[  Alarm  ] Assertion (file c.c, line 5)
            By Value, with pending:
             - Unreachable program point (file c.c, line 5)

--------------------------------------------------------------------------------
--- Status Report Summary
--------------------------------------------------------------------------------
     1 Alarm emitted
     1 Total
--------------------------------------------------------------------------------

pending信息列出了完成证明所需的所有属性。对于由 Value/Eva 插件发出的法规,发出的唯一依赖始终是可达性依赖。

(这实际上是一种误导:第 n 个 属性 的状态实际上取决于属性 k[=24= 的状态] 与 k < n。这会生成一个太大的依赖关系图,因此不会跟踪这些依赖关系。)