diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c index 04cb8cbdf7534223386e6d7ad5e7ab96680c50fc..15d4cac23157437357e95845df2697bc0d418868 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1324.c @@ -36,7 +36,7 @@ int main(void) __e_acsl_memory_init((int *)0,(char ***)0,(size_t)8); int t[7] = {1, 4, 4, 5, 5, 5, 7}; __e_acsl_store_block((void *)(t),(size_t)28); - __e_acsl_full_init((void *)(t)); + __e_acsl_full_init((void *)(& t)); int n = __gen_e_acsl_sorted(t,7); /*@ assert n ≡ 1; */ __e_acsl_assert(n == 1,(char *)"Assertion",(char *)"main",(char *)"n == 1", diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c index 847be00d2729b5edcb71933b1e8656473daeabcf..b8273d8fe62fad816e8a98579fdff5eab734b89d 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_bts1326.c @@ -37,7 +37,7 @@ int main(void) __e_acsl_store_block((void *)(& av),(size_t)4); ArrayInt Accel = {1, 2, 3, 4, 5}; __e_acsl_store_block((void *)(Accel),(size_t)20); - __e_acsl_full_init((void *)(Accel)); + __e_acsl_full_init((void *)(& Accel)); __gen_e_acsl_atp_NORMAL_computeAverageAccel(& Accel,& av); __retres = 0; __e_acsl_delete_block((void *)(& av)); diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_base_addr.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_base_addr.c index cda25d31466dad9c290dc6e5870580e699913ebc..d616deab77b69cd695ddae705aa16fcba506a23d 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_base_addr.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_base_addr.c @@ -62,7 +62,7 @@ int main(void) } int a[4] = {1, 2, 3, 4}; __e_acsl_store_block((void *)(a),(size_t)16); - __e_acsl_full_init((void *)(a)); + __e_acsl_full_init((void *)(& a)); __e_acsl_full_init((void *)(& pa)); pa = (int *)(& a); /*@ assert \base_addr((int *)a) ≡ \base_addr(pa); */ diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_block_length.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_block_length.c index a26e60fdf22c9643de34d842124db5e412e8bf71..ff65273e6fdea736066d7924a505856a50f9c6d1 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_block_length.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_block_length.c @@ -77,7 +77,7 @@ int main(void) } int a[4] = {1, 2, 3, 4}; __e_acsl_store_block((void *)(a),(size_t)16); - __e_acsl_full_init((void *)(a)); + __e_acsl_full_init((void *)(& a)); int *pa = (int *)(& a); __e_acsl_store_block((void *)(& pa),(size_t)8); __e_acsl_full_init((void *)(& pa)); diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_offset.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_offset.c index e2289b74086b7f54ca23111674f7e2ab14e58df1..617b202e126d1c1dcc236e2c6fa7fd74c4e08ca6 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_offset.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_offset.c @@ -48,7 +48,7 @@ int main(void) } int a[4] = {1, 2, 3, 4}; __e_acsl_store_block((void *)(a),(size_t)16); - __e_acsl_full_init((void *)(a)); + __e_acsl_full_init((void *)(& a)); /*@ assert \offset((int *)a) ≡ 0; */ { int __gen_e_acsl_offset_5; diff --git a/src/plugins/e-acsl/tests/runtime/oracle/gen_ptr.c b/src/plugins/e-acsl/tests/runtime/oracle/gen_ptr.c index ecf41c7d55ec8f48443d951445a2cc4d0f5e1320..9905156012e38f80d2b53e035a64bde39be56bcd 100644 --- a/src/plugins/e-acsl/tests/runtime/oracle/gen_ptr.c +++ b/src/plugins/e-acsl/tests/runtime/oracle/gen_ptr.c @@ -9,7 +9,7 @@ int main(void) __e_acsl_full_init((void *)(& x)); int t[3] = {2, 3, 4}; __e_acsl_store_block((void *)(t),(size_t)12); - __e_acsl_full_init((void *)(t)); + __e_acsl_full_init((void *)(& t)); int *p = & x; __e_acsl_store_block((void *)(& p),(size_t)8); __e_acsl_full_init((void *)(& p)); diff --git a/src/plugins/e-acsl/visit.ml b/src/plugins/e-acsl/visit.ml index 87fa598c447d74499a9dd942d8fe8bab5d5ea3d7..408339a86df360db46d4fab5a41c652183a325ba 100644 --- a/src/plugins/e-acsl/visit.ml +++ b/src/plugins/e-acsl/visit.ml @@ -579,6 +579,14 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" been modified from the time where pre actions have been executed. Use [function_env] to get it back. *) let env = !function_env in + let env = + if generate then + (* Add initialization statements and store_block statements stemming + from Local_init *) + self#add_initializers stmt env kf + else + env + in let env = if stmt.ghost && generate then begin stmt.ghost <- false; @@ -688,15 +696,6 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" ~global_clear:false Env.Before in - (match stmt.skind with - | Instr (Local_init (vi, _, _)) when - Mmodel_analysis.must_model_vi ~bhv:self#behavior ~kf vi -> - let vi = Cil.get_varinfo self#behavior vi in - (* must generate the new stmts after the declaration of [vi] *) - post_block.bstmts <- - post_block.bstmts @ - [Misc.mk_store_stmt vi; Misc.mk_full_init_stmt vi] - | _ -> ()); let post_block = Cil.transient_block post_block in Misc.mk_block prj new_stmt post_block, env end else @@ -710,55 +709,46 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" in Cil.ChangeDoChildrenPost(stmt, mk_block) - method private add_initializer loc checked_lv assigned_lv = + method private add_initializer loc ?vi lv ?(post=false) stmt env kf = assert generate; - let kf = Extlib.the self#current_kf in - let stmt = Extlib.the self#current_stmt in let may_safely_ignore = function | Var vi, NoOffset -> vi.vglob || vi.vformal | _ -> false in - - if not (may_safely_ignore assigned_lv) && - Mmodel_analysis.must_model_lval ~kf ~stmt checked_lv - then - let new_stmt = - (* must be in the new project to build a new stmt *) - Project.on - prj - (Misc.mk_initialize ~loc) - assigned_lv - in + if not (may_safely_ignore lv) && Mmodel_analysis.must_model_lval ~kf lv then let before = Cil.memo_stmt self#behavior stmt in + let new_stmt = Project.on prj (Misc.mk_initialize ~loc) lv in let new_stmt = Cil.memo_stmt self#behavior new_stmt in - function_env := Env.add_stmt ~before !function_env new_stmt - - method !vinst = function - | Set(old_lv, _, _) -> - if generate then - Cil.DoChildrenPost - (function - | [ Set(new_lv, _, loc) ] as l -> - self#add_initializer loc old_lv new_lv; - l - | _ -> assert false) - else - Cil.DoChildren - | Local_init _ -> - (* initialization is registered in vstmt. *) - Cil.DoChildren - | Call(Some old_ret, _, _, _) -> - if not generate || Misc.is_generated_kf (Extlib.the self#current_kf) then - Cil.DoChildren + let env = Env.add_stmt ~post ~before env new_stmt in + let env = match vi with + | None -> env + | Some vi -> + let new_stmt = Project.on prj Misc.mk_store_stmt vi in + let new_stmt = Cil.memo_stmt self#behavior new_stmt in + Env.add_stmt ~post ~before env new_stmt + in + env else - Cil.DoChildrenPost - (function - | [ Call(Some new_ret, _, _, loc) ] as l -> - self#add_initializer loc old_ret new_ret; - l - | _ -> assert false) - | _ -> - Cil.DoChildren + env + + method private add_initializers stmt env kf = + let do_instr instr = + match instr with + | Set(lv, _, loc) -> + self#add_initializer loc lv stmt env kf + | Local_init(vi, _, loc) -> + let lv = (Var(vi), NoOffset) in + self#add_initializer loc ~vi lv ~post:true stmt env kf + | Call (Some lv, _, _, loc) -> + if not (Misc.is_generated_kf kf) then + self#add_initializer loc lv ~post:false stmt env kf + else env + | _ -> env + in + match stmt.skind with + | Instr(i) -> do_instr i + | _ -> env + method !vblock blk = let handle_memory new_blk =