From 7e510b1e8b757c1656b2badc2482e2c7137f5986 Mon Sep 17 00:00:00 2001 From: Thibaut Benjamin <thibaut.benjamin@gmail.com> Date: Mon, 23 May 2022 14:06:14 +0200 Subject: [PATCH] [e-acsl] code review --- .../e-acsl/src/code_generator/assert.ml | 32 +++++++++---------- .../e-acsl/src/code_generator/assert.mli | 14 ++++---- .../e-acsl/src/code_generator/contract.ml | 3 +- src/plugins/e-acsl/src/code_generator/libc.ml | 8 ++--- .../e-acsl/src/code_generator/logic_array.ml | 8 ++--- .../e-acsl/src/code_generator/loops.ml | 13 +++----- .../src/code_generator/memory_translate.ml | 3 +- .../src/code_generator/translate_ats.ml | 2 +- .../code_generator/translate_predicates.ml | 12 +++---- .../src/code_generator/translate_rtes.ml | 4 +-- .../src/code_generator/translate_terms.ml | 26 +++++++-------- 11 files changed, 58 insertions(+), 67 deletions(-) diff --git a/src/plugins/e-acsl/src/code_generator/assert.ml b/src/plugins/e-acsl/src/code_generator/assert.ml index 22335bcb773..d44043c3078 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.ml +++ b/src/plugins/e-acsl/src/code_generator/assert.ml @@ -166,12 +166,9 @@ let add_pending_register_data ~loc { data_ptr } name e = let name = Cil.mkString ~loc name in let args = data_ptr :: name :: args in let stmt = Smart_stmt.rtl_call ~loc fct args in - let queue = - if Stack.is_empty pending_register_data - then Queue.create () - else Stack.pop pending_register_data in - Queue.add stmt queue; - Stack.push queue pending_register_data + match Stack.top_opt pending_register_data with + | None -> Stack.push (Queue.create()) pending_register_data + | Some queue -> Queue.add stmt queue let do_pending_register_data env = if Stack.is_empty pending_register_data then env @@ -182,9 +179,10 @@ let do_pending_register_data env = else let stmt = Queue.pop queue in do_queue (Env.add_stmt env stmt) - in do_queue env + in + do_queue env -let register ~loc env ?(force=false) name e adata = +let register ~loc ?(force=false) name e adata = if Options.Assert_print_data.get () then match adata, e.enode with | Some adata, Const _ when not force -> @@ -195,31 +193,31 @@ let register ~loc env ?(force=false) name e adata = name "3" and value [3]. The registration can be forced for expressions like [sizeof(int)] for instance that are [Const] values but not directly known. *) - Some adata, env + Some adata | Some adata, _ -> let adata = { adata with data_registered = true } in add_pending_register_data ~loc adata name e; - Some adata, env - | None, _ -> None, env + Some adata + | None, _ -> None else - adata, env + adata -let register_term ~loc env ?force t e adata = +let register_term ~loc ?force t e adata = let name = Format.asprintf "@[%a@]" Printer.pp_term t in - register ~loc env name ?force e adata + register ~loc name ?force e adata let register_pred ~loc env ?force p e adata = if Env.annotation_kind env == RTE then (* When translating RTE, we do not want to print the result of the predicate because they should be the only predicate in an assertion clause. *) - adata, env + adata else let name = Format.asprintf "@[%a@]" Printer.pp_predicate p in - register ~loc env name ?force e adata + register ~loc name ?force e adata let register_pred_or_term ~loc env ?force pot e adata = match pot with - | PoT_term t -> register_term ~loc env ?force t e adata + | PoT_term t -> register_term ~loc ?force t e adata | PoT_pred p -> register_pred ~loc env ?force p e adata let kind_to_string loc k = diff --git a/src/plugins/e-acsl/src/code_generator/assert.mli b/src/plugins/e-acsl/src/code_generator/assert.mli index c3e1492780b..d3c5bc1f131 100644 --- a/src/plugins/e-acsl/src/code_generator/assert.mli +++ b/src/plugins/e-acsl/src/code_generator/assert.mli @@ -58,18 +58,21 @@ val clean: loc:location -> Env.t -> t -> Env.t memory allocated in the C structure will not be freed. *) val push_pending_register_data: unit -> unit +(** data registering must be delayed after RTE checks to avoid crashes. + [push_pending_register_data] adds a regisration in the pending ones that + will be generated after the RTE. *) val do_pending_register_data: Env.t -> Env.t +(** [do_pending_register_data] performs all the pending restrations*) val register: loc:location -> - Env.t -> ?force:bool -> string -> exp -> t -> - t * Env.t + t (** [register ~loc env ?force name e adata] registers the data [e] corresponding to the name [name] to the assertion context [adata]. If [force] is false (default), the data is not registered if the expression @@ -78,12 +81,11 @@ val register: val register_term: loc:location -> - Env.t -> ?force:bool -> term -> exp -> t -> - t * Env.t + t (** [register_term ~loc env ?force t e adata] registers the data [e] corresponding to the term [t] to the assertion context [adata]. The parameter [force] has the same signification than for the function @@ -96,7 +98,7 @@ val register_pred: predicate -> exp -> t -> - t * Env.t + t (** [register_pred ~loc env ?force p e adata] registers the data [e] corresponding to the predicate [p] to the assertion context [adata]. The parameter [force] has the same signification than for the function @@ -109,7 +111,7 @@ val register_pred_or_term: pred_or_term -> exp -> t -> - t * Env.t + t (** [register_pred_or_term ~loc kf env ?force pot e adata] registers the data [e] corresponding to the predicate or term [pot] to the assertion context [adata]. The parameter [force] has the same signification than for the diff --git a/src/plugins/e-acsl/src/code_generator/contract.ml b/src/plugins/e-acsl/src/code_generator/contract.ml index 879ee0ceadf..7df4b992fbd 100644 --- a/src/plugins/e-acsl/src/code_generator/contract.ml +++ b/src/plugins/e-acsl/src/code_generator/contract.ml @@ -507,10 +507,9 @@ let check_active_behaviors ~ppt_to_translate ~get_or_create_var kf env contract (* Create assertions for complete and disjoint behaviors checks *) let create_assert_stmt env bop msg = let adata, env = Assert.empty ~loc kf env in - let adata, env = + let adata = Assert.register ~loc - env "number of active behaviors" active_bhvrs_e adata diff --git a/src/plugins/e-acsl/src/code_generator/libc.ml b/src/plugins/e-acsl/src/code_generator/libc.ml index 2121d714196..ac785dbf7b4 100644 --- a/src/plugins/e-acsl/src/code_generator/libc.ml +++ b/src/plugins/e-acsl/src/code_generator/libc.ml @@ -224,7 +224,7 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = Logic_const.prel ~loc (Rge, t, Cil.lzero ~loc ()) in let adata, env = Assert.empty ~loc kf env in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in let assertion, env = Assert.runtime_check ~adata @@ -248,9 +248,9 @@ let term_to_sizet_exp ~loc ~name ?(check_lower_bound=true) kf env t = let upper_guard_pp = Logic_const.prel ~loc (Rle, t, sizet_max_t) in let upper_guard = Cil.mkBinOp ~loc Le e sizet_max_e in let adata, env = Assert.empty ~loc kf env in - let adata, env = Assert.register_term ~loc env t e adata in - let adata, env = - Assert.register ~loc env "SIZE_MAX" sizet_max_e adata + let adata = Assert.register_term ~loc t e adata in + let adata = + Assert.register ~loc "SIZE_MAX" sizet_max_e adata in let assertion, env = Assert.runtime_check 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 a156e946340..571e94bb1d1 100644 --- a/src/plugins/e-acsl/src/code_generator/logic_array.ml +++ b/src/plugins/e-acsl/src/code_generator/logic_array.ml @@ -242,12 +242,8 @@ let comparison_to_exp ~loc kf env ~name bop array1 array2 = let p = { p with pred_name = "array_coercion" :: p.pred_name } in Typing.preprocess_predicate (Env.Local_vars.get env) p; let adata, env = Assert.empty ~loc kf env in - let adata, env = - Assert.register ~loc env "destination length" len adata - in - let adata, env = - Assert.register ~loc env "current length" len_orig adata - in + let adata = Assert.register ~loc "destination length" len adata in + let adata = Assert.register ~loc "current length" len_orig adata in let stmt, env = Assert.runtime_check ~adata ~pred_kind:Assert RTE kf env e p in diff --git a/src/plugins/e-acsl/src/code_generator/loops.ml b/src/plugins/e-acsl/src/code_generator/loops.ml index 11e6b986d01..e37356f2704 100644 --- a/src/plugins/e-acsl/src/code_generator/loops.ml +++ b/src/plugins/e-acsl/src/code_generator/loops.ml @@ -131,18 +131,16 @@ let handle_annotations env kf stmt = Printer.pp_term t in let adata, env = Assert.empty ~loc kf env in - let adata, env = + let adata = Assert.register ~loc - env (Format.asprintf "old %a" Printer.pp_term t_old) e_old adata in - let adata, env = + let adata = Assert.register ~loc - env (Format.asprintf "current %a" Printer.pp_term t) e adata @@ -180,10 +178,9 @@ let handle_annotations env kf stmt = Printer.pp_relation Rge in let adata1, env = Assert.empty ~loc kf env in - let adata1, env = + let adata1 = Assert.register ~loc - env (Format.asprintf "old %a" Printer.pp_term t) e_old adata1 @@ -223,10 +220,10 @@ let handle_annotations env kf stmt = in Assert.register ~loc - env (Format.asprintf "current %a" Printer.pp_term t) e - adata2 + adata2, + env else adata2, env 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 28c79c7a0fd..c500760a4a1 100644 --- a/src/plugins/e-acsl/src/code_generator/memory_translate.ml +++ b/src/plugins/e-acsl/src/code_generator/memory_translate.ml @@ -309,10 +309,9 @@ let term_to_ptr_and_size ~adata ~loc kf env t = in let ty = Misc.cty t.term_type in let sizeof = Smart_exp.ptr_sizeof ~loc ty in - let adata, env = + let adata = Assert.register ~loc:t.term_loc - env (Format.asprintf "%a" Printer.pp_exp sizeof) sizeof adata diff --git a/src/plugins/e-acsl/src/code_generator/translate_ats.ml b/src/plugins/e-acsl/src/code_generator/translate_ats.ml index db66a9ec78b..0d12bfa2e85 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_ats.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_ats.ml @@ -526,7 +526,7 @@ let to_exp ~loc ~adata kf env pot label = else Smart_exp.lval ~loc (Cil.var vi), env in - let adata, env= + let adata = Assert.register_pred_or_term ~loc env pot e adata in e, adata, env diff --git a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml index 74c612f88de..55ae1ad1f49 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_predicates.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_predicates.ml @@ -81,7 +81,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = | Papp (li, [], args) -> let e, adata, env = Logic_functions.app_to_exp ~adata ~loc kf env li args in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env | Pdangling _ -> Env.not_yet env "\\dangling" | Pobject_pointer _ -> Env.not_yet env "\\object_pointer" @@ -203,7 +203,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = e, adata, env | Pforall _ | Pexists _ -> let e, env = Quantif.quantif_to_exp kf env p in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env | Pat(p', label) -> if inplace then @@ -221,7 +221,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = let e, adata, env = Memory_translate.call_valid ~adata ~loc kf name Cil.intType env t p in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env in (* we already transformed \valid(t) into \initialized(&t) && \valid(t): @@ -260,7 +260,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = tlist p in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env | Pinitialized(BuiltinLabel Here, t) -> let e, adata, env = @@ -283,7 +283,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = [ t ] p in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env) in e, adata, env @@ -293,7 +293,7 @@ let rec predicate_content_to_exp ~adata ?(inplace=false) ?name kf env p = let e, adata, env = Memory_translate.call ~adata ~loc kf "freeable" Cil.intType env t in - let adata, env = Assert.register_pred ~loc env p e adata in + let adata = Assert.register_pred ~loc env p e adata in e, adata, env | Pfreeable _ -> Env.not_yet env "labeled \\freeable" | Pfresh _ -> Env.not_yet env "\\fresh" diff --git a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml index 85349be86be..6c54a45e3fb 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_rtes.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_rtes.ml @@ -68,8 +68,8 @@ let exp ?filter kf env e = | None -> l in List.iter (Typing.preprocess_rte ~lenv:(Env.Local_vars.get env)) l; - let env = rte_annots Printer.pp_exp e kf env l - in Assert.do_pending_register_data env + let env = rte_annots Printer.pp_exp e kf env l in + Assert.do_pending_register_data env let () = Translate_terms.translate_rte_exp_ref := exp; diff --git a/src/plugins/e-acsl/src/code_generator/translate_terms.ml b/src/plugins/e-acsl/src/code_generator/translate_terms.ml index c5530b377bc..c9672f2a0f1 100644 --- a/src/plugins/e-acsl/src/code_generator/translate_terms.ml +++ b/src/plugins/e-acsl/src/code_generator/translate_terms.ml @@ -256,7 +256,7 @@ and extended_quantifier_to_exp ~adata ~loc kf env t t_min t_max lambda name = let final_stmt = (Cil.mkBlock [ init_k_stmt; for_stmt ]) in Env.Logic_binding.remove env k; let env = Env.add_stmt env (Smart_stmt.block_stmt final_stmt) in - let adata, env = Assert.register_term ~loc env t acc_as_exp adata in + let adata = Assert.register_term ~loc t acc_as_exp adata in acc_as_exp, adata, env, Typed_number.C_number, "" | _ -> assert false @@ -271,29 +271,29 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = | TLval lv -> let lv, env, name = tlval_to_lval kf env lv in let e = Smart_exp.lval ~loc lv in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, name | TSizeOf ty -> let e = Cil.sizeOf ~loc ty in - let adata, env = Assert.register_term ~loc env ~force:true t e adata in + let adata = Assert.register_term ~loc ~force:true t e adata in e, adata, env, Typed_number.C_number, "sizeof" | TSizeOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.sizeOf ~loc (Cil.typeOf e') in - let adata, env = Assert.register_term ~loc env ~force:true t e adata in + let adata = Assert.register_term ~loc ~force:true t e adata in e, adata, env, Typed_number.C_number, "sizeof" | TSizeOfStr s -> let e = Cil.new_exp ~loc (SizeOfStr s) in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "sizeofstr" | TAlignOf ty -> let e = Cil.new_exp ~loc (AlignOf ty) in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "alignof" | TAlignOfE t' -> let e', _, env = to_exp ~adata:Assert.no_data kf env t' in let e = Cil.new_exp ~loc (AlignOfE e') in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "alignof" | TUnOp(Neg | BNot as op, t') -> let ty = Typing.get_typ ~lenv t in @@ -746,12 +746,12 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = | TAddrOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOf ~loc lv in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "addrof" | TStartOf lv -> let lv, env, _ = tlval_to_lval kf env lv in let e = Cil.mkAddrOrStartOf ~loc lv in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "startof" | Tapp(li, _, [ t1; t2; {term_node = Tlambda([ _ ], _)} as lambda ]) when li.l_body = LBnone && (li.l_var_info.lv_name = "\\sum" || @@ -763,7 +763,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = | Tapp(li, [], args) -> let e, adata, env = Logic_functions.app_to_exp ~adata ~loc ~tapp:t kf env li args in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, "app" | Tapp(_, _ :: _, _) -> Env.not_yet env "logic functions with labels" @@ -819,7 +819,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = env t' in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, name | Tbase_addr _ -> Env.not_yet env "labeled \\base_addr" | Toffset(BuiltinLabel Here, t') -> @@ -828,7 +828,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e, adata, env = Memory_translate.call ~adata ~loc kf name size_t env t' in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, name | Toffset _ -> Env.not_yet env "labeled \\offset" | Tblock_length(BuiltinLabel Here, t') -> @@ -837,7 +837,7 @@ and context_insensitive_term_to_exp ~adata ?(inplace=false) kf env t = let e, adata, env = Memory_translate.call ~adata ~loc kf name size_t env t' in - let adata, env = Assert.register_term ~loc env t e adata in + let adata = Assert.register_term ~loc t e adata in e, adata, env, Typed_number.C_number, name | Tblock_length _ -> Env.not_yet env "labeled \\block_length" | Tnull -> -- GitLab