From ef9e3cb6436b4b1d572dca6ab880918f8edc4ac5 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Mon, 7 Jun 2021 09:59:00 +0200 Subject: [PATCH] [wp] Warns on missing terminates clause --- src/plugins/wp/cfgAnnot.ml | 6 ++++-- src/plugins/wp/cfgAnnot.mli | 2 +- src/plugins/wp/cfgCalculus.ml | 7 ++++++- .../wp_acsl/oracle/terminates_call_options.0.res.oracle | 4 ++++ .../wp_acsl/oracle/terminates_call_options.1.res.oracle | 4 ++++ .../oracle_qualif/terminates_call_options.0.res.oracle | 4 ++++ .../oracle_qualif/terminates_call_options.1.res.oracle | 4 ++++ 7 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml index 719ddd88bf4..d5ff495ee8e 100644 --- a/src/plugins/wp/cfgAnnot.ml +++ b/src/plugins/wp/cfgAnnot.ml @@ -191,12 +191,14 @@ let get_terminates kf = let get_terminates_call kf = match (Annotations.funspec kf).spec_terminates with | Some p -> - normalize_terminates p + false, normalize_terminates p | None when Kernel_function.is_definition kf -> + true, if Wp_parameters.TerminatesDefinitions.get () then Logic_const.ptrue else Logic_const.pfalse | None -> + true, if Wp_parameters.TerminatesDeclarations.get () then Logic_const.ptrue else Logic_const.pfalse @@ -213,7 +215,7 @@ type contract = { contract_exit : WpPropId.pred_info list ; contract_smoke : WpPropId.pred_info list ; contract_assigns : Cil_types.assigns ; - contract_terminates : Cil_types.predicate ; + contract_terminates : bool * Cil_types.predicate ; } let assigns_upper_bound behaviors = diff --git a/src/plugins/wp/cfgAnnot.mli b/src/plugins/wp/cfgAnnot.mli index 0c42f7aab3c..9b29f4bc05d 100644 --- a/src/plugins/wp/cfgAnnot.mli +++ b/src/plugins/wp/cfgAnnot.mli @@ -105,7 +105,7 @@ type contract = { contract_exit : pred_info list ; contract_smoke : pred_info list ; contract_assigns : assigns ; - contract_terminates : predicate ; + contract_terminates : bool * predicate ; (* boolean: default generated *) } val get_call_contract : ?smoking:stmt -> kernel_function -> stmt -> contract diff --git a/src/plugins/wp/cfgCalculus.ml b/src/plugins/wp/cfgCalculus.ml index 953aab3bce7..73b9047ed0b 100644 --- a/src/plugins/wp/cfgCalculus.ml +++ b/src/plugins/wp/cfgCalculus.ml @@ -338,7 +338,12 @@ struct in match env.terminates with | Some p when is_default_bhv env.mode && is_selected ~goal:true env p -> - W.call_terminates env.we p s kf es ~callee_t:c.contract_terminates w_pre + let generated, callee_t = c.contract_terminates in + if generated then + Wp_parameters.warning ~once:true + "Missing terminates clause on call to %a, defaults to %a" + Kernel_function.pretty kf Cil_printer.pp_predicate callee_t ; + W.call_terminates env.we p s kf es ~callee_t w_pre | _ -> w_pre let do_complete_disjoint env w = diff --git a/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.0.res.oracle index e7438f3f838..f979bf58718 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/terminates_call_options.0.res.oracle @@ -2,6 +2,10 @@ [kernel] Parsing tests/wp_acsl/terminates_call_options.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] tests/wp_acsl/terminates_call_options.i:21: Warning: + Missing terminates clause on call to declaration, defaults to \false +[wp] tests/wp_acsl/terminates_call_options.i:26: Warning: + Missing terminates clause on call to definition, defaults to \false ------------------------------------------------------------ Function call_declaration ------------------------------------------------------------ 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 70d3c69e5e6..51f3303b866 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 @@ -2,6 +2,10 @@ [kernel] Parsing tests/wp_acsl/terminates_call_options.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] tests/wp_acsl/terminates_call_options.i:21: Warning: + Missing terminates clause on call to declaration, defaults to \true +[wp] tests/wp_acsl/terminates_call_options.i:26: Warning: + Missing terminates clause on call to definition, defaults to \true ------------------------------------------------------------ Function call_declaration ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.0.res.oracle index 6fe363eac68..8870dde3d61 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/terminates_call_options.0.res.oracle @@ -2,6 +2,10 @@ [kernel] Parsing tests/wp_acsl/terminates_call_options.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] tests/wp_acsl/terminates_call_options.i:21: Warning: + Missing terminates clause on call to declaration, defaults to \false +[wp] tests/wp_acsl/terminates_call_options.i:26: Warning: + Missing terminates clause on call to definition, defaults to \false [wp] 5 goals scheduled [wp] [Qed] Goal typed_definition_assigns : Valid [wp] [Qed] Goal typed_call_declaration_terminates_part1 : Valid 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 5f8991d6c83..356e129f4e4 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 @@ -2,6 +2,10 @@ [kernel] Parsing tests/wp_acsl/terminates_call_options.i (no preprocessing) [wp] Running WP plugin... [wp] Warning: Missing RTE guards +[wp] tests/wp_acsl/terminates_call_options.i:21: Warning: + Missing terminates clause on call to declaration, defaults to \true +[wp] tests/wp_acsl/terminates_call_options.i:26: Warning: + Missing terminates clause on call to definition, defaults to \true [wp] 3 goals scheduled [wp] [Qed] Goal typed_definition_assigns : Valid [wp] [Qed] Goal typed_call_declaration_terminates : Valid -- GitLab