From 5214045916e92d61acd81e3817f0afe01a4d5ac9 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Wed, 23 Jun 2021 15:16:55 +0200 Subject: [PATCH] [wp] Fix trivial terminates proof display + count --- src/plugins/wp/register.ml | 11 +++++++++-- .../oracle/terminates_call_options.1.res.oracle | 1 + .../wp_acsl/oracle/terminates_formulae.res.oracle | 1 + .../oracle/terminates_variant_option.0.res.oracle | 4 ++++ .../oracle/terminates_variant_option.1.res.oracle | 4 ++++ .../terminates_call_options.1.res.oracle | 3 ++- .../oracle_qualif/terminates_formulae.res.oracle | 3 ++- .../terminates_variant_option.0.res.oracle | 6 +++++- .../terminates_variant_option.1.res.oracle | 6 +++++- src/plugins/wp/wpAnnot.ml | 5 +++++ src/plugins/wp/wpAnnot.mli | 1 + 11 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/plugins/wp/register.ml b/src/plugins/wp/register.ml index 9bff55614bf..de651b862f8 100644 --- a/src/plugins/wp/register.ml +++ b/src/plugins/wp/register.ml @@ -182,6 +182,7 @@ let clear_scheduled () = exercised := 0 ; session := GOALS.empty ; provers := PM.empty ; + WpAnnot.trivial_terminates := 0 ; WpAnnot.unreachable_proved := 0 ; WpAnnot.unreachable_failed := 0 ; end @@ -462,13 +463,19 @@ let do_report_scheduled () = Wp_parameters.result "%d goal%s generated" !exercised plural else let total = - !scheduled + !WpAnnot.unreachable_failed + !WpAnnot.unreachable_proved in + !scheduled + + !WpAnnot.unreachable_failed + + !WpAnnot.unreachable_proved + + !WpAnnot.trivial_terminates in if total > 0 then begin + let passed = + !WpAnnot.unreachable_proved + !WpAnnot.trivial_terminates + in let passed = GOALS.fold (fun g n -> if Wpo.is_passed g then succ n else n - ) !session !WpAnnot.unreachable_proved in + ) !session passed in let mode = Cache.get_mode () in if mode <> Cache.NoCache then do_report_cache_usage mode ; Wp_parameters.result "%t" diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.1.res.oracle index d367e2cc027..48a05c29bcb 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.1.res.oracle @@ -4,6 +4,7 @@ [wp] Warning: Missing RTE guards [wp] tests/wp_acsl/terminates_call_options.c:20: Warning: Missing terminates clause for definition, populates 'terminates \true' +[wp] [CFG] Goal definition_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_call_options.c:32: Warning: Missing terminates clause for no_spec_generates_goal, populates 'terminates \true' [wp] tests/wp_acsl/terminates_call_options.c:17: Warning: diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle index 81be3fb1362..ecb311b8fc1 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_formulae.res.oracle @@ -2,6 +2,7 @@ [kernel] Parsing tests/wp_acsl/terminates_formulae.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] [CFG] Goal variant_terminates : Valid (Trivial) ------------------------------------------------------------ Function base_call ------------------------------------------------------------ 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 758094faa1e..1d76571f54f 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 @@ -1,7 +1,11 @@ # frama-c -wp [...] [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... +[wp] [CFG] Goal f1_terminates : Valid (Trivial) [wp] Warning: Missing RTE guards +[wp] [CFG] Goal fails_decreases_terminates : Valid (Trivial) +[wp] [CFG] Goal fails_positive_terminates : Valid (Trivial) +[wp] [CFG] Goal trivial_variant_terminates : Valid (Trivial) ------------------------------------------------------------ Function f1 ------------------------------------------------------------ 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 2324adf7478..09103afc39d 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 @@ -1,9 +1,13 @@ # frama-c -wp [...] [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... +[wp] [CFG] Goal f1_terminates : Valid (Trivial) [wp] Warning: Missing RTE guards +[wp] [CFG] Goal fails_decreases_terminates : Valid (Trivial) +[wp] [CFG] Goal fails_positive_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_variant_option.i:52: Warning: Loop variant is always trivially verified (terminates \false) +[wp] [CFG] Goal trivial_variant_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_variant_option.i:59: Warning: Loop variant is always trivially verified (terminates \false) ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.1.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.1.res.oracle index e6da7db09de..5d8ea75da40 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.1.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.1.res.oracle @@ -4,6 +4,7 @@ [wp] Warning: Missing RTE guards [wp] tests/wp_acsl/terminates_call_options.c:20: Warning: Missing terminates clause for definition, populates 'terminates \true' +[wp] [CFG] Goal definition_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_call_options.c:32: Warning: Missing terminates clause for no_spec_generates_goal, populates 'terminates \true' [wp] tests/wp_acsl/terminates_call_options.c:17: Warning: @@ -20,7 +21,7 @@ [wp] [Qed] Goal typed_call_definition_terminates : Valid [wp] [Alt-Ergo] Goal typed_no_spec_generates_goal_terminates : Unsuccess [wp] [Qed] Goal typed_libc_call_terminates : Valid -[wp] Proved goals: 4 / 5 +[wp] Proved goals: 5 / 6 Qed: 4 Alt-Ergo: 0 (unsuccess: 1) ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle index 095b267c6ec..1793ed9f2e9 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_formulae.res.oracle @@ -2,6 +2,7 @@ [kernel] Parsing tests/wp_acsl/terminates_formulae.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] [CFG] Goal variant_terminates : Valid (Trivial) [wp] 10 goals scheduled [wp] [Alt-Ergo] Goal typed_base_call_terminates : Unsuccess [wp] [Qed] Goal typed_call_same_terminates : Valid @@ -13,7 +14,7 @@ [wp] [Qed] Goal typed_variant_loop_variant_positive : Valid [wp] [Alt-Ergo] Goal typed_no_variant_terminates : Unsuccess [wp] [Qed] Goal typed_no_variant_loop_assigns : Valid -[wp] Proved goals: 6 / 10 +[wp] Proved goals: 7 / 11 Qed: 5 Alt-Ergo: 1 (unsuccess: 4) ------------------------------------------------------------ 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 927ca972024..35fe4fded76 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 @@ -1,7 +1,11 @@ # frama-c -wp [...] [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... +[wp] [CFG] Goal f1_terminates : Valid (Trivial) [wp] Warning: Missing RTE guards +[wp] [CFG] Goal fails_decreases_terminates : Valid (Trivial) +[wp] [CFG] Goal fails_positive_terminates : Valid (Trivial) +[wp] [CFG] Goal trivial_variant_terminates : Valid (Trivial) [wp] 20 goals scheduled [wp] [Alt-Ergo] Goal typed_fails_positive_loop_invariant_preserved : Valid [wp] [Qed] Goal typed_fails_positive_loop_invariant_established : Valid @@ -23,7 +27,7 @@ [wp] [Qed] Goal typed_trivial_variant_default_loop_assigns : Valid [wp] [Alt-Ergo] Goal typed_trivial_variant_default_loop_variant_decrease : Unsuccess [wp] [Alt-Ergo] Goal typed_trivial_variant_default_loop_variant_positive : Unsuccess -[wp] Proved goals: 13 / 20 +[wp] Proved goals: 17 / 24 Qed: 10 Alt-Ergo: 3 (unsuccess: 7) ------------------------------------------------------------ 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 f7c77c67df3..fa298976b2b 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 @@ -1,9 +1,13 @@ # frama-c -wp [...] [kernel] Parsing tests/wp_acsl/terminates_variant_option.i (no preprocessing) [wp] Running WP plugin... +[wp] [CFG] Goal f1_terminates : Valid (Trivial) [wp] Warning: Missing RTE guards +[wp] [CFG] Goal fails_decreases_terminates : Valid (Trivial) +[wp] [CFG] Goal fails_positive_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_variant_option.i:52: Warning: Loop variant is always trivially verified (terminates \false) +[wp] [CFG] Goal trivial_variant_terminates : Valid (Trivial) [wp] tests/wp_acsl/terminates_variant_option.i:59: Warning: Loop variant is always trivially verified (terminates \false) [wp] 20 goals scheduled @@ -27,7 +31,7 @@ [wp] [Qed] Goal typed_trivial_variant_default_loop_assigns : Valid [wp] [Qed] Goal typed_trivial_variant_default_loop_variant_decrease : Valid [wp] [Qed] Goal typed_trivial_variant_default_loop_variant_positive : Valid -[wp] Proved goals: 20 / 20 +[wp] Proved goals: 24 / 24 Qed: 16 Alt-Ergo: 4 ------------------------------------------------------------ diff --git a/src/plugins/wp/wpAnnot.ml b/src/plugins/wp/wpAnnot.ml index 71fe8e549cb..7f6b34561c7 100644 --- a/src/plugins/wp/wpAnnot.ml +++ b/src/plugins/wp/wpAnnot.ml @@ -79,6 +79,9 @@ let set_unreachable pid = (* -------------------------------------------------------------------------- *) (* --- Status of Terminates Annotations --- *) (* -------------------------------------------------------------------------- *) + +let trivial_terminates = ref 0 + let wp_trivially_terminates = Emitter.create "Trivial Termination" @@ -87,6 +90,8 @@ let wp_trivially_terminates = ~tuning:[] (* TBC *) let set_trivially_terminates p = + incr trivial_terminates ; + Wp_parameters.result "[CFG] Goal %a : Valid (Trivial)" WpPropId.pp_propid p ; let pid = WpPropId.property_of_id p in Property_status.emit wp_trivially_terminates ~hyps:[] pid Property_status.True diff --git a/src/plugins/wp/wpAnnot.mli b/src/plugins/wp/wpAnnot.mli index e08e70cdcbc..171a83e4299 100644 --- a/src/plugins/wp/wpAnnot.mli +++ b/src/plugins/wp/wpAnnot.mli @@ -34,6 +34,7 @@ open Cil_types val unreachable_proved : int ref val unreachable_failed : int ref +val trivial_terminates : int ref val set_unreachable : WpPropId.prop_id -> unit val set_trivially_terminates : WpPropId.prop_id -> unit -- GitLab