From d3b8510aa3cfd54ce256a94d55d32c07d6a821a6 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Thu, 3 Jun 2021 15:33:57 +0200 Subject: [PATCH] [wp] Add terminates variant test --- .../terminates_variant_option.0.res.oracle | 58 +++++++++++++++++++ .../terminates_variant_option.1.res.oracle | 53 +++++++++++++++++ .../terminates_variant_option.0.res.oracle | 15 +++-- .../terminates_variant_option.1.res.oracle | 15 +++-- .../tests/wp_acsl/terminates_variant_option.i | 15 +++++ 5 files changed, 148 insertions(+), 8 deletions(-) diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle index ed3edfb084b..4c0590685f6 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.0.res.oracle @@ -2,6 +2,64 @@ [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function f1 +------------------------------------------------------------ + +Goal Termination-condition (file tests/wp_acsl/terminates_variant_option.i, line 34) in 'f1': +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_acsl/terminates_variant_option.i, line 37): +Assume { + Type: is_sint32(c1_0) /\ is_sint32(cpt_0) /\ is_sint32(cpt_0 - 1). + (* Residual *) + When: c1_0 != 0. + (* Goal *) + When: 0 <= c1_0. + (* Invariant *) + Have: (cpt_0 <= c1_0) /\ (0 <= cpt_0). + (* Else *) + Have: 2 <= cpt_0. +} +Prove: (0 < cpt_0) /\ (cpt_0 <= (1 + c1_0)). + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_acsl/terminates_variant_option.i, line 37): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_acsl/terminates_variant_option.i, line 38): +Prove: true. + +------------------------------------------------------------ + +Goal Decreasing of Loop variant at loop (file tests/wp_acsl/terminates_variant_option.i, line 41): +Assume { + Type: is_sint32(cpt_0). + (* Invariant *) + Have: (cpt_0 <= 0) /\ (0 <= cpt_0). +} +Prove: false. + +------------------------------------------------------------ + +Goal Positivity of Loop variant at loop (file tests/wp_acsl/terminates_variant_option.i, line 41): +Assume { + Type: is_sint32(c1_0) /\ is_sint32(cpt_0) /\ is_sint32(cpt_0 - 1). + (* Residual *) + When: c1_0 != 0. + (* Invariant *) + Have: ((0 <= c1_0) -> ((cpt_0 <= c1_0) /\ (0 <= cpt_0))). + (* Else *) + Have: 2 <= cpt_0. +} +Prove: 0 <= cpt_0. + +------------------------------------------------------------ ------------------------------------------------------------ Function fails_decreases ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle index c7b38328fe5..9b9f856e6c3 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_variant_option.1.res.oracle @@ -2,6 +2,59 @@ [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +------------------------------------------------------------ + Function f1 +------------------------------------------------------------ + +Goal Termination-condition (file tests/wp_acsl/terminates_variant_option.i, line 34) in 'f1': +Prove: true. + +------------------------------------------------------------ + +Goal Preservation of Invariant (file tests/wp_acsl/terminates_variant_option.i, line 37): +Assume { + Type: is_sint32(c1_0) /\ is_sint32(cpt_0) /\ is_sint32(cpt_0 - 1). + (* Residual *) + When: c1_0 != 0. + (* Goal *) + When: 0 <= c1_0. + (* Invariant *) + Have: (cpt_0 <= c1_0) /\ (0 <= cpt_0). + (* Else *) + Have: 2 <= cpt_0. +} +Prove: (0 < cpt_0) /\ (cpt_0 <= (1 + c1_0)). + +------------------------------------------------------------ + +Goal Establishment of Invariant (file tests/wp_acsl/terminates_variant_option.i, line 37): +Prove: true. + +------------------------------------------------------------ + +Goal Loop assigns (file tests/wp_acsl/terminates_variant_option.i, line 38): +Prove: true. + +------------------------------------------------------------ + +Goal Decreasing of Loop variant at loop (file tests/wp_acsl/terminates_variant_option.i, line 41): +Prove: true. + +------------------------------------------------------------ + +Goal Positivity of Loop variant at loop (file tests/wp_acsl/terminates_variant_option.i, line 41): +Assume { + Type: is_sint32(c1_0) /\ is_sint32(cpt_0) /\ is_sint32(cpt_0 - 1). + (* Goal *) + When: c1_0 != 0. + (* Invariant *) + Have: ((0 <= c1_0) -> ((cpt_0 <= c1_0) /\ (0 <= cpt_0))). + (* Else *) + Have: 2 <= cpt_0. +} +Prove: 0 <= cpt_0. + +------------------------------------------------------------ ------------------------------------------------------------ Function fails_decreases ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.0.res.oracle index 3d7432f4f67..ed6365ffa37 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.0.res.oracle @@ -2,7 +2,7 @@ [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] 11 goals scheduled +[wp] 17 goals scheduled [wp] [Qed] Goal typed_fails_positive_terminates : Valid [wp] [Alt-Ergo] Goal typed_fails_positive_loop_invariant_preserved : Valid [wp] [Qed] Goal typed_fails_positive_loop_invariant_established : Valid @@ -14,11 +14,18 @@ [wp] [Qed] Goal typed_fails_decreases_loop_assigns : Valid [wp] [Alt-Ergo] Goal typed_fails_decreases_loop_variant_decrease : Unsuccess [wp] [Qed] Goal typed_fails_decreases_loop_variant_positive : Valid -[wp] Proved goals: 9 / 11 - Qed: 8 - Alt-Ergo: 1 (unsuccess: 2) +[wp] [Qed] Goal typed_f1_terminates : Valid +[wp] [Alt-Ergo] Goal typed_f1_loop_invariant_preserved : Valid +[wp] [Qed] Goal typed_f1_loop_invariant_established : Valid +[wp] [Qed] Goal typed_f1_loop_assigns : Valid +[wp] [Alt-Ergo] Goal typed_f1_loop_variant_decrease : Unsuccess +[wp] [Alt-Ergo] Goal typed_f1_loop_variant_positive : Valid +[wp] Proved goals: 14 / 17 + Qed: 11 + Alt-Ergo: 3 (unsuccess: 3) ------------------------------------------------------------ Functions WP Alt-Ergo Total Success fails_positive 5 1 7 85.7% fails_decreases 3 - 4 75.0% + f1 3 2 6 83.3% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.1.res.oracle index 4724528d6f0..c7928a6b12e 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_variant_option.1.res.oracle @@ -2,7 +2,7 @@ [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards -[wp] 11 goals scheduled +[wp] 17 goals scheduled [wp] [Qed] Goal typed_fails_positive_terminates : Valid [wp] [Alt-Ergo] Goal typed_fails_positive_loop_invariant_preserved : Valid [wp] [Qed] Goal typed_fails_positive_loop_invariant_established : Valid @@ -14,11 +14,18 @@ [wp] [Qed] Goal typed_fails_decreases_loop_assigns : Valid [wp] [Alt-Ergo] Goal typed_fails_decreases_loop_variant_decrease : Valid [wp] [Qed] Goal typed_fails_decreases_loop_variant_positive : Valid -[wp] Proved goals: 11 / 11 - Qed: 9 - Alt-Ergo: 2 +[wp] [Qed] Goal typed_f1_terminates : Valid +[wp] [Alt-Ergo] Goal typed_f1_loop_invariant_preserved : Valid +[wp] [Qed] Goal typed_f1_loop_invariant_established : Valid +[wp] [Qed] Goal typed_f1_loop_assigns : Valid +[wp] [Qed] Goal typed_f1_loop_variant_decrease : Valid +[wp] [Alt-Ergo] Goal typed_f1_loop_variant_positive : Valid +[wp] Proved goals: 17 / 17 + Qed: 13 + Alt-Ergo: 4 ------------------------------------------------------------ Functions WP Alt-Ergo Total Success fails_positive 6 1 7 100% fails_decreases 3 1 4 100% + f1 4 2 6 100% ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/terminates_variant_option.i b/src/plugins/wp/tests/wp_acsl/terminates_variant_option.i index 872b0734b8f..e220801f80a 100644 --- a/src/plugins/wp/tests/wp_acsl/terminates_variant_option.i +++ b/src/plugins/wp/tests/wp_acsl/terminates_variant_option.i @@ -30,3 +30,18 @@ void fails_decreases(int keep_going){ if(! keep_going) i-- ; } } + +//@ terminates c1 != 0; +void f1 (int c1, int c2) { + int cpt = c1 ; + /*@ loop invariant c1 >= 0 ==> 0 <= cpt <= c1 ; + @ loop assigns cpt ; + @ loop variant cpt ; + @*/ + while (1) { + if (c1 || c2) { + cpt --; + if (cpt <= 0) break; + } + } +} -- GitLab