Я считаю, что мне не хватает чего-то очевидного, но я много пробовал, и мне не удалось найти источник проблемы.
Я следую acsl guide from Фрама- C. Вот вводный пример того, как проверить правильность нахождения максимального значения в массиве:
/*@ 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-er go тайм-аут до подтверждения свойства. Что бы ни стоило, я попробовал с большим таймаутом, но он все равно не работает.
Я использую:
- frama- c: 19.1
- why3: 1.2.0
- alt-er go: 2.3.2
Я запускаю это на Ubuntu 18.04 и перед запуском команды, которую я запускаю: why3 config --detect
чтобы убедиться, что почему3 знает об alt-er go.
Есть идеи? Может ли кто-нибудь проверить, что этот пример не работает? Любая помощь будет принята с благодарностью!