diff --git a/src/plugins/e-acsl/src/code_generator/contract.ml b/src/plugins/e-acsl/src/code_generator/contract.ml index c8cb861fb7545b5dfc6b8d79de6151c85ee52808..2941c7092287790b086356c04af09667c4194596 100644 --- a/src/plugins/e-acsl/src/code_generator/contract.ml +++ b/src/plugins/e-acsl/src/code_generator/contract.ml @@ -354,25 +354,33 @@ let check_requires kf kinstr env contract = if !must_translate_ppt_ref (Property.ip_of_requires kf kinstr b ip_requires) then let tp_requires = ip_requires.ip_content in - let requires = tp_requires.tp_statement in - let loc = requires.pred_loc in - Cil.CurrentLoc.set loc; - (* Prepend the name of the behavior *) - let requires = - { requires with pred_name = b.b_name :: requires.pred_name } - in - (* Create runtime check *) - let requires_e, env = - Translate.generalized_untyped_predicate_to_exp kf env requires - in - let stmt = - Smart_stmt.runtime_check - Smart_stmt.Precondition - kf - requires_e - requires - in - env, stmt :: stmts + let pred_kind = tp_requires.tp_kind in + match pred_kind with + | Assert | Check -> + let requires = tp_requires.tp_statement in + let loc = requires.pred_loc in + Cil.CurrentLoc.set loc; + (* Prepend the name of the behavior *) + let requires = + { requires with pred_name = b.b_name :: requires.pred_name } + in + (* Create runtime check *) + let requires_e, env = + Translate.generalized_untyped_predicate_to_exp + kf + env + requires + in + let stmt = + Smart_stmt.runtime_check + ~pred_kind + Smart_stmt.Precondition + kf + requires_e + requires + in + env, stmt :: stmts + | Admit -> env, stmts else env, stmts) (env, []) @@ -501,6 +509,7 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf kinstr env co Smart_stmt.runtime_check_with_msg ~loc msg + ~pred_kind:Assert (Env.annotation_kind env) kf (Cil.mkBinOp ~loc bop active_bhvrs_e (Cil.one ~loc)) @@ -648,30 +657,41 @@ let check_post_conds kf kinstr env contract = if !must_translate_ppt_ref (Property.ip_of_ensures kf kinstr b tp) then let tp_post_cond = ip_post_cond.ip_content in - let post_cond = tp_post_cond.tp_statement in - let loc = post_cond.pred_loc in - Cil.CurrentLoc.set loc; - match termination with - | Normal -> - (* Prepend the name of the behavior *) - let post_cond = - { post_cond with pred_name = b.b_name :: post_cond.pred_name } - in - (* Create runtime check *) - let post_cond_e, env = - Translate.generalized_untyped_predicate_to_exp kf env post_cond - in - let stmt = - Smart_stmt.runtime_check - Smart_stmt.Postcondition - kf - post_cond_e - post_cond - in - env, stmt :: stmts - | Exits | Breaks | Continues | Returns -> - Error.process_error (Error.not_yet "abnormal termination case in behavior"); - env, stmts + let pred_kind = tp_post_cond.tp_kind in + match pred_kind with + | Assert | Check -> begin + let post_cond = tp_post_cond.tp_statement in + let loc = post_cond.pred_loc in + Cil.CurrentLoc.set loc; + match termination with + | Normal -> + (* Prepend the name of the behavior *) + let post_cond = + { post_cond with + pred_name = b.b_name :: post_cond.pred_name } + in + (* Create runtime check *) + let post_cond_e, env = + Translate.generalized_untyped_predicate_to_exp + kf + env + post_cond + in + let stmt = + Smart_stmt.runtime_check + ~pred_kind + Smart_stmt.Postcondition + kf + post_cond_e + post_cond + in + env, stmt :: stmts + | Exits | Breaks | Continues | Returns -> + Error.process_error + (Error.not_yet "abnormal termination case in behavior"); + env, stmts + end + | Admit -> env, stmts else env, stmts) (env, []) diff --git a/src/plugins/e-acsl/src/code_generator/logic_array.ml b/src/plugins/e-acsl/src/code_generator/logic_array.ml index 688905079da3776c370c325c926742cf09f8a91e..fd0f45a325cf236baabe260b3b7fc303161bed62 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_array.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml @@ -241,7 +241,7 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 = in let p = { p with pred_name = "array_coercion" :: p.pred_name } in let stmt = - Smart_stmt.runtime_check Smart_stmt.RTE kf e p + Smart_stmt.runtime_check ~pred_kind:Assert Smart_stmt.RTE kf e p in stmt :: stmts, env in diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index 1948f3a857ba062a100023b00c0b6c0ad2c0a8ea..ab0c7fa3d38c81d2a0e42f34332bdcb9897d0ed0 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -251,7 +251,7 @@ let rec mk_nested_loops ~loc mk_innermost_block kf env lscope_vars = | Some p -> let e, env = !predicate_to_exp_ref kf (Env.push env) p in let stmt, env = - Smart_stmt.runtime_check Smart_stmt.RTE kf e p, env + Smart_stmt.runtime_check ~pred_kind:Assert Smart_stmt.RTE kf e p, env in let b, env = Env.pop_and_get env stmt ~global_clear:false Env.After in let guard_for_small_type = Smart_stmt.block_stmt b in diff --git a/src/plugins/e-acsl/src/code_generator/memory_translate.ml b/src/plugins/e-acsl/src/code_generator/memory_translate.ml index 976c5c91d3ea809a1739bb30fd0b722f0f1b70d3..41fedc2159be7bf64f11fbd1c3ae434ab874fb70 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_translate.ml +++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml @@ -158,7 +158,7 @@ let gmp_to_sizet ~loc kf env size p = None sizet (fun vi _ -> - [ Smart_stmt.runtime_check Smart_stmt.RTE kf guard p; + [ Smart_stmt.runtime_check ~pred_kind:Assert Smart_stmt.RTE kf guard p; Smart_stmt.rtl_call ~loc ~result:(Cil.var vi) ~prefix:"" diff --git a/src/plugins/e-acsl/src/code_generator/translate.ml b/src/plugins/e-acsl/src/code_generator/translate.ml index 81056b5d8b5969839d6eca4c3bc6abccede0367e..b5b44048da759670b1884a7e9d2123655d6afd62 100644 --- a/src/plugins/e-acsl/src/code_generator/translate.ml +++ b/src/plugins/e-acsl/src/code_generator/translate.ml @@ -372,6 +372,7 @@ and context_insensitive_term_to_exp kf env t = assert (Gmp_types.Z.is_t ty); let cond = Smart_stmt.runtime_check + ~pred_kind:Assert (Env.annotation_kind env) kf guard @@ -456,6 +457,7 @@ and context_insensitive_term_to_exp kf env t = let pname = bop_name ^ "_rhs_fits_in_mp_bitcnt_t" in let pred = { pred with pred_name = pname :: pred.pred_name } in let cond = Smart_stmt.runtime_check + ~pred_kind:Assert Smart_stmt.RTE kf coerce_guard @@ -520,6 +522,7 @@ and context_insensitive_term_to_exp kf env t = let e1_guard_cond = let pred = Logic_const.prel ~loc (Rge, t1, zero) in let cond = Smart_stmt.runtime_check + ~pred_kind:Assert Smart_stmt.RTE kf e1_guard @@ -1040,6 +1043,7 @@ and predicate_content_to_exp ?name kf env p = in let stmt = Smart_stmt.runtime_check + ~pred_kind:Assert Smart_stmt.RTE kf e @@ -1152,25 +1156,29 @@ and translate_rte ?filter kf env e = translate_rte_annots Printer.pp_exp e kf env l and translate_predicate ?pred_to_print kf env p = - Options.feedback ~dkey ~level:3 "translating predicate %a" - Printer.pp_toplevel_predicate p; - let pred_to_print = - match pred_to_print with - | Some pred -> - Options.feedback ~dkey ~level:3 "(predicate to print %a)" - Printer.pp_predicate pred; - pred - | None -> p.tp_statement - in - let e, env = generalized_untyped_predicate_to_exp kf env p.tp_statement in - Env.add_stmt - env - kf - (Smart_stmt.runtime_check - (Env.annotation_kind env) - kf - e - pred_to_print) + match p.tp_kind with + | Assert | Check -> + Options.feedback ~dkey ~level:3 "translating predicate %a" + Printer.pp_toplevel_predicate p; + let pred_to_print = + match pred_to_print with + | Some pred -> + Options.feedback ~dkey ~level:3 "(predicate to print %a)" + Printer.pp_predicate pred; + pred + | None -> p.tp_statement + in + let e, env = generalized_untyped_predicate_to_exp kf env p.tp_statement in + Env.add_stmt + env + kf + (Smart_stmt.runtime_check + ~pred_kind:p.tp_kind + (Env.annotation_kind env) + kf + e + pred_to_print) + | Admit -> env let predicate_to_exp_without_rte ?name kf env p = predicate_to_exp ?name kf env p (* forget optional argument ?rte *)