diff --git a/src/plugins/wp/cfgAnnot.ml b/src/plugins/wp/cfgAnnot.ml index 719ddd88bf4ad108260ad2ea520087f5add265ce..d5ff495ee8e3ce6d4540d2a11f600e893d713473 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 0c42f7aab3cbccaa2fde6d5345715203b1cc5fef..9b29f4bc05d661b117f77eb31f912f0103cfe30c 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 953aab3bce73223ada331ddb1d509f05e5b44e3b..73b9047ed0bd81ff8eb72811aefc2058a4159294 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 e7438f3f838b84e937d4ea0733665af8b075d31b..f979bf5871825db84a8cc5a2d576c3e4e201fafe 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 70d3c69e5e6273dec1fef967f73dccd716797409..51f3303b8662e204b597f65564e6abf65cee4548 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 6fe363eac68b79186b971164e152cbd566e9b31e..8870dde3d615c67ac13a2ce8fce8af477847cefb 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 5f8991d6c83955d5174d2c1bfbbc27c308baab10..356e129f4e4bea0b9a054c5e4c650c2f0601d7cb 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