我能够使用Frama-C证明以下程序,这是令人惊讶的,因为1)有一个断言假,2)循环不变量不成立(数组a
保持1不是2)。我在这里错过了什么吗?
/*@ requires \valid(a+ (0..9)) && \valid(b+ (0..9));
*/
void test_foo(int *a, char *b) {
int i = 0;
/*@ loop invariant \forall int j; 0 <= j < i ==> a[j] == 2;
loop invariant \forall int j; 0 <= j < i ==> b[j] == 'a';
*/
for (int i = 0; i < 10; i++) {
a[i] = 1;
b[i] = 'a';
}
//@ assert \false;
}
我正在运行frama-c:
frama-c -wp -wp-invariants -wp-prover "why3:alt-ergo" -wp-model "Typed,int,real" -wp-par 8 -wp-timeout 15 -wp-out wp.out test.c
我在钠和镁版本上都看到了同样的行为。
答案 0 :(得分:3)
-wp-invariants
并不意味着处理&#34;正常&#34;循环不变量,例如你提供的那些,但是&#34;一般归纳不变量&#34;在ACSL section 2.4.2的意义上。因此,您可以从命令行中删除此选项。然后一些证明义务按预期失败。
另外注意你的循环注释是不完整的:正如WP警告的那样,你应该有一个循环分配,比如
loop assigns i, a[0 .. 9], b[0 .. 9];
然后,为了能够证明这个loop assigns
,您需要指定i
变异间隔:
loop invariant 0<=i<=10;
最后,-wp-invariants
使证明义务在存在正常循环注释时表现奇怪的事实应该被视为错误并在Frama-C's bts报告。