Frama-c WP 和先决条件

Frama-c WP and preconditions

我有两个关于先决条件和 Frama-c wp 的问题:

  1. Frama-c如何证明前提条件?
  2. Frama-c 何时尝试证明先决条件?

我问这些问题是因为有时 frama-c wp 甚至不尝试证明,有时它成功地证明了先决条件,有时它失败了,例如在第一个屏幕截图中没有尝试证明

但在第二个屏幕截图中,我们尝试证明但失败了

我假设主要功能对此有影响,但它是全貌吗?只有当函数是 main 时,前置条件才需要证明吗?

作为初步,让我明确一点,对于“How/When Frama-C 是否证明先决条件”的问题没有明确的答案。更准确地说,这在很大程度上取决于您使用的插件。既然你提到了WP,我就重点说一下。

在一般情况下,函数 f 的前提条件应该在每个调用点都成立(这就是函数契约概念的来源:f 保证 post-条件成立时 returns 仅适用于可以保证调用前前提条件成立的调用者)。因此,如果您在选择证明的函数中没有调用 f,则不会尝试证明先决条件。

现在,main 函数(或更准确地说是 Frama-C 的 -main 选项指定的函数,默认为 main)有一个例外,因为它应该是程序的入口点,并且通常不会在其他任何地方调用,尝试检查初始程序状态(其中所有全局变量都等于它们的初始值,形式可以有任何值)遵守前提。请注意,选项 -lib-entry 表示关于全局变量具有初始值的假设不应该成立,在这种情况下,WP 将不会尝试证明 main 函数的先决条件,因为它无法做出任何假设关于它的调用上下文。例如,以下代码:

int X = 1;

/*@ requires X == 1;
    ensures \result == 1;
*/
int f() { return X; }

frama-c -wp -main f file.c 将提供 2 个(有效)证明义务,frama-c -wp -main f -libentry file.c

仅提供 1 个