From 1157b7165fe68908400cf2fe10acc3e84e31a1c7 Mon Sep 17 00:00:00 2001 From: Julien Signoles <julien.signoles@cea.fr> Date: Thu, 5 Sep 2013 14:22:54 +0000 Subject: [PATCH] [E-ACSL] code factorisation which improves translation of ghost stmts --- src/plugins/e-acsl/TODO | 2 ++ .../tests/e-acsl-runtime/oracle/gen_ghost.c | 4 ++-- .../tests/e-acsl-runtime/oracle/gen_ghost2.c | 4 ++-- src/plugins/e-acsl/translate.ml | 15 ++++++++++----- src/plugins/e-acsl/translate.mli | 8 ++++++++ src/plugins/e-acsl/visit.ml | 14 ++++---------- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/plugins/e-acsl/TODO b/src/plugins/e-acsl/TODO index 9f341167868..01bc1e87408 100644 --- a/src/plugins/e-acsl/TODO +++ b/src/plugins/e-acsl/TODO @@ -7,6 +7,8 @@ - [Yannick] Logic functions - [Nikola颹 temporal memory properties - memory profiling +- [Guillaume] ajouter les annotations de RTE dans la table des annotations + (avec une option) ##################### # E-ACSL CONSTRUCTS # diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost.c b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost.c index 34479ee8fd8..dc45740ff84 100644 --- a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost.c +++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost.c @@ -90,10 +90,10 @@ int main(void) int __e_acsl_valid; __initialize((void *)P,sizeof(int)); __e_acsl_valid_read = __valid_read((void *)P,sizeof(int)); - e_acsl_assert(__e_acsl_valid_read,(char *)"Assertion",(char *)"main", + e_acsl_assert(__e_acsl_valid_read,(char *)"RTE",(char *)"main", (char *)"mem_access: \\valid_read(P)",16); __e_acsl_valid = __valid((void *)P,sizeof(int)); - e_acsl_assert(__e_acsl_valid,(char *)"Assertion",(char *)"main", + e_acsl_assert(__e_acsl_valid,(char *)"RTE",(char *)"main", (char *)"mem_access: \\valid(P)",16); (*P) ++; } diff --git a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost2.c b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost2.c index 2b5100d6236..08dae00e205 100644 --- a/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost2.c +++ b/src/plugins/e-acsl/tests/e-acsl-runtime/oracle/gen_ghost2.c @@ -102,10 +102,10 @@ int main(void) int __e_acsl_valid; __initialize((void *)P,sizeof(int)); __e_acsl_valid_read = __valid_read((void *)P,sizeof(int)); - e_acsl_assert(__e_acsl_valid_read,(char *)"Assertion",(char *)"main", + e_acsl_assert(__e_acsl_valid_read,(char *)"RTE",(char *)"main", (char *)"mem_access: \\valid_read(P)",16); __e_acsl_valid = __valid((void *)P,sizeof(int)); - e_acsl_assert(__e_acsl_valid,(char *)"Assertion",(char *)"main", + e_acsl_assert(__e_acsl_valid,(char *)"RTE",(char *)"main", (char *)"mem_access: \\valid(P)",16); (*P) ++; } diff --git a/src/plugins/e-acsl/translate.ml b/src/plugins/e-acsl/translate.ml index 50ebd5558d7..568bc13d485 100644 --- a/src/plugins/e-acsl/translate.ml +++ b/src/plugins/e-acsl/translate.ml @@ -637,9 +637,10 @@ and named_predicate_to_exp ?name kf ?rte env p = let env = if rte then translate_rte kf env e else env in e, env -and translate_rte kf env e = - let stmt = Cil.mkStmtOneInstr ~valid_sid:true (Skip e.eloc) in - let l = get_rte kf stmt e in +and translate_rte_annots: + 'a. (Format.formatter -> 'a -> unit) -> 'a -> + kernel_function -> Env.t -> code_annotation list -> Env.t = + fun pp elt kf env l -> let old_valid = !is_visiting_valid in let old_kind = Env.annotation_kind env in let env = Env.set_annotation_kind env Misc.RTE in @@ -649,8 +650,7 @@ and translate_rte kf env e = | AAssert(_, p) -> handle_error (fun env -> - Options.feedback ~dkey ~level:4 "prevent RTE from %a" - Printer.pp_exp e; + Options.feedback ~dkey ~level:4 "prevent RTE from %a" pp elt; translate_named_predicate kf (Env.rte env false) p) env | _ -> assert false) @@ -660,6 +660,11 @@ and translate_rte kf env e = is_visiting_valid := old_valid; Env.set_annotation_kind env old_kind +and translate_rte kf env e = + let stmt = Cil.mkStmtOneInstr ~valid_sid:true (Skip e.eloc) in + let l = get_rte kf stmt e in + translate_rte_annots Printer.pp_exp e kf env l + and translate_named_predicate kf env p = Options.feedback ~dkey ~level:3 "translating predicate %a" Printer.pp_predicate_named p; diff --git a/src/plugins/e-acsl/translate.mli b/src/plugins/e-acsl/translate.mli index f8ac91db35f..dca783d90e3 100644 --- a/src/plugins/e-acsl/translate.mli +++ b/src/plugins/e-acsl/translate.mli @@ -35,6 +35,14 @@ val translate_post_code_annotation: val translate_named_predicate: kernel_function -> Env.t -> predicate named -> Env.t +val translate_rte_annots: + (Format.formatter -> 'a -> unit) -> + 'a -> + kernel_function -> + Env.t -> + code_annotation list -> + Env.t + val predicate_to_exp: kernel_function -> predicate named -> exp val set_original_project: Project.t -> unit diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index 1bb2874ea2c..3902c6e387b 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -460,13 +460,7 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" stmt.ghost <- false; (* translate potential RTEs of ghost code *) let rtes = get_rte_by_stmt kf stmt in - List.fold_left - (fun env a -> match a.annot_content with - | AAssert(_, p) -> - Translate.translate_named_predicate kf (Env.rte env false) p - | _ -> assert false) - env - rtes + Translate.translate_rte_annots Printer.pp_stmt stmt kf env rtes end else env in @@ -522,11 +516,11 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" let b, env = Env.pop_and_get env stmt ~global_clear:true Env.After in - if is_main && Pre_analysis.use_model () && generate then begin + if is_main && Pre_analysis.use_model () then begin let stmts = b.bstmts in let l = List.rev stmts in match l with - | [] -> assert false (* return is here *) + | [] -> assert false (* at least the 'return' stmt *) | ret :: l -> let loc = Stmt.loc stmt in let delete_stmts = @@ -548,7 +542,7 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" new_stmt, env else stmt, env - else + else (* i.e. not (is_return stmt) *) if generate then let stmt = rename_alloc_function stmt in (* must generate [pre_block] which includes [stmt] before generating -- GitLab