let state_top_addresses_of_locals ~is_block offsetmap_top_addresses_of_locals fundec =
let f k offsm =
let locals, r = offsetmap_top_addresses_of_locals offsm in
let found_locals = not (Cvalue.V_Offsetmap.equal r offsm) in
if found_locals then
warn_locals_escape is_block fundec k locals;
r
in
(fun (state:Cvalue.Model.t) ->
let simple_state = state in
let f base acc =
try
let offset_to_clean = Cvalue.Model.find_base base simple_state
in
let cleaned_offsetmap = f base offset_to_clean in
Cvalue.Model.add_offsetmap base cleaned_offsetmap acc
with Not_found -> acc
in
try
(Location_Bits.Top_Param.fold
f
!bases_containing_locals
(f Base.null simple_state))
with Location_Bits.Top_Param.Error_Top ->
begin
let f k offsm acc =
let locals, r = offsetmap_top_addresses_of_locals offsm in
let found_locals = not (Cvalue.V_Offsetmap.equal r offsm) in
if found_locals then
warn_locals_escape is_block fundec k locals;
Cvalue.Model.add_offsetmap k r acc
in
let result =
try
(Cvalue.Model.fold_base_offsetmap
f
state
Cvalue.Model.empty_map)
with Cvalue.Model.Error_Bottom -> Cvalue.Model.bottom
in
result
end)