diff --git a/src/plugins/e-acsl/src/code_generator/injector.ml b/src/plugins/e-acsl/src/code_generator/injector.ml index edd21f3ac73dcfef5a4db49fae648c980ad05c38..d43acb78c5be2cd1b80ce39f937a739e56df6939 100644 --- a/src/plugins/e-acsl/src/code_generator/injector.ml +++ b/src/plugins/e-acsl/src/code_generator/injector.ml @@ -88,7 +88,7 @@ let rec inject_in_init env kf_opt vi off = function in CompoundInit(typ, List.rev l), env -let inject_in_local_init loc env kf vi = function +let inject_in_local_init ~loc ~stmt env kf vi = function | ConsInit (fvi, sz :: _, _) as init when Functions.Libc.is_vla_alloc_name fvi.vname -> (* add a store statement when creating a variable length array *) @@ -99,6 +99,13 @@ let inject_in_local_init loc env kf vi = function | ConsInit (caller, args, kind) -> let args, env = replace_literal_strings_in_args env (Some kf) args in let caller, args = rename_caller ~loc caller args in + let _, env = + if Libc.is_writing_memory caller then begin + let result = Var vi, NoOffset in + Libc.update_memory_model ~loc ~stmt env kf ~result caller args + end else + None, env + in ConsInit(caller, args, kind), env | AssignInit init -> @@ -153,6 +160,14 @@ let inject_in_instr env kf stmt = function Cil.evar fvi, args | _ -> caller, args in + (* if this is a call to a libc function that writes into a memory block then + manually update the memory model *) + let result, env = + match caller.enode with + | Lval (Var cvi, _) when Libc.is_writing_memory cvi -> + Libc.update_memory_model ~loc ~stmt env kf ?result cvi args + | _ -> result, env + in (* add statement tracking initialization of return values *) let env = match result with @@ -177,7 +192,7 @@ let inject_in_instr env kf stmt = function | Local_init(vi, linit, loc) -> let lv = Var vi, NoOffset in let env = add_initializer loc ~vi lv ~post:true stmt env kf in - let linit, env = inject_in_local_init loc env kf vi linit in + let linit, env = inject_in_local_init ~loc ~stmt env kf vi linit in Local_init(vi, linit, loc), env (* nothing to do: *)