suppose have following annotated c-code:
int a[3] = {0}; /*@ requires \valid(a+(0..2)); assigns a[0..2]; ensures \forall int j; 0 <= j < 3 ==> (a[j] == j); */ int main() { int = 0; /*@ loop assigns i, a[0..(i-1)]; loop invariant inv1: 0 <= <= 3; loop invariant inv2: \forall int k; 0 < k <= ==> a[k-1] == k-1; */ while (i < l) { a[i] = i; i++; } //@ assert final_i: == 3; //@ assert final_a: a[1] == 1; } neither z3 nor alt-ergo able prove assert final_a , post condition; z3 not able prove loop invariant also;
output alt-ergo:
# ~/queue $ frama-c -wp -wp-prover alt-ergo test2.c [kernel] parsing framac_share/libc/__fc_builtin_for_normalization.i (no preprocessing) [kernel] parsing test2.c (with preprocessing) [wp] running wp plugin... [wp] collecting axiomatic usage [wp] warning: missing rte guards [wp] 14 goals scheduled [wp] [qed] goal typed_main_pre : valid [wp] [qed] goal typed_main_loop_inv_inv1_established : valid [wp] [qed] goal typed_main_loop_inv_inv2_established : valid [wp] [qed] goal typed_main_assert_final_i : valid [wp] [alt-ergo] goal typed_main_loop_inv_inv1_preserved : valid (qed:1ms) (14ms) (15) [wp] [qed] goal typed_main_loop_assign_part1 : valid [wp] [alt-ergo] goal typed_main_loop_inv_inv2_preserved : valid (45ms) (51) [wp] [qed] goal typed_main_loop_assign_part2 : valid [wp] [qed] goal typed_main_loop_assign_part3 : valid [wp] [qed] goal typed_main_assign_part1 : valid [wp] [qed] goal typed_main_assign_part3 : valid [wp] [alt-ergo] goal typed_main_assign_part2 : valid (20ms) (12) [wp] [alt-ergo] goal typed_main_assert_final_a : unknown (3.5s) [wp] [alt-ergo] goal typed_main_post : timeout (qed:1ms) [wp] proved goals: 12 / 14 qed: 9 (0ms-1ms) alt-ergo: 3 (14ms-45ms) (51) (interrupted: 1) (unknown: 1) output z3:
$ frama-c -wp -wp-prover z3 test2.c [kernel] parsing framac_share/libc/__fc_builtin_for_normalization.i (no preprocessing) [kernel] parsing test2.c (with preprocessing) [wp] running wp plugin... [wp] collecting axiomatic usage [wp] warning: missing rte guards [wp] 14 goals scheduled [wp] [qed] goal typed_main_pre : valid [wp] [qed] goal typed_main_loop_inv_inv1_established : valid [wp] [qed] goal typed_main_loop_inv_inv2_established : valid [wp] [qed] goal typed_main_assert_final_i : valid [wp] [z3] goal typed_main_loop_inv_inv1_preserved : valid (20ms) [wp] [qed] goal typed_main_loop_assign_part1 : valid [wp] [qed] goal typed_main_loop_assign_part2 : valid [wp] [qed] goal typed_main_loop_assign_part3 : valid [wp] [qed] goal typed_main_assign_part1 : valid [wp] [z3] goal typed_main_assert_final_a : unknown (356ms) [wp] [qed] goal typed_main_assign_part3 : valid [wp] [z3] goal typed_main_post : unknown (911ms) [wp] [z3] goal typed_main_assign_part2 : valid (10ms) [wp] [z3] goal typed_main_loop_inv_inv2_preserved : unknown (1.3s) [wp] proved goals: 11 / 14 qed: 9 z3: 2 (10ms-20ms) (unknown: 3) what missing?
if change inv2 loop invariant to:
loop invariant inv2: \forall int k; 0 <= k < ==> a[k] == k; .. alt-ergo able prove final_a assertion , main() postconditions.
Comments
Post a Comment