我相信我遗漏了一些明显的东西,但我已经尝试了很多,但我还没有找到问题的根源。
我正在关注 Frama-C 的 acsl指南。有这个介绍性示例说明如何验证在数组中找到最大值的正确性:
/*@ requires n > 0;
requires \valid(p+ (0 .. n-1));
ensures \forall int i; 0 <= i <= n-1 ==> \result >= p[i];
ensures \exists int e; 0 <= e <= n-1 && \result == p[e];
*/
int max_seq(int* p, int n) {
int res = *p;
for(int i = 0; i < n; i++) {
if (res < *p) { res = *p; }
p++;
}
return res;
}
但是,运行frama-c -wp -wp-prover alt-ergo samenum.c -then -report
我得到:
[wp] Warning: Missing RTE guards
[wp] samenum.c:8: Warning: Missing assigns clause (assigns 'everything' instead)
[wp] 2 goals scheduled
[wp] [Alt-Ergo] Goal typed_max_seq_ensures_2 : Timeout (Qed:1ms) (10s)
[wp] [Alt-Ergo] Goal typed_max_seq_ensures : Timeout (Qed:2ms) (10s)
[wp] Proved goals: 0 / 2
Alt-Ergo: 0 (interrupted: 2)
[report] Computing properties status...
--------------------------------------------------------------------------------
--- Properties of Function 'max_seq'
--------------------------------------------------------------------------------
[ - ] Post-condition (file samenum.c, line 3)
tried with Wp.typed.
[ - ] Post-condition (file samenum.c, line 4)
tried with Wp.typed.
[ - ] Default behavior
tried with Frama-C kernel.
似乎 alt-ergo 在证明该属性之前就超时了。值得一提的是,我尝试了更高的超时时间,但它仍然不起作用。
我在用:
- 帧-c:19.1
- 为什么3:1.2.0
- alt-ergo:2.3.2
我在 Ubuntu 18.04 上运行它,在运行我运行的命令之前:why3 config --detect
确保为什么 3 知道 alt-ergo。
有任何想法吗?任何人都可以验证这是示例不起作用吗?任何帮助将不胜感激!