let assigns_to_zone_inputs_state state assigns =
try
let treat_one_zone acc (_,ins) =
match ins with
[] -> raise Top_input
| ins ->
(try
List.fold_left
(fun acc loc ->
let clocs = match loc with
Location loc ->
!Db.Properties.Interp.loc_to_lval loc.it_content
| Nothing -> []
in
List.fold_left
(fun acc cin ->
Zone.join acc
(!Db.Value.lval_to_zone_state state cin))
acc clocs)
acc ins
with Invalid_argument "not an lvalue" ->
CilE.warn_once "Can not interpret assigns clause; Ignoring.";
raise Top_input)
in
match assigns with
[] -> Zone.bottom
| [Nothing,_] -> Zone.bottom
| _ -> List.fold_left treat_one_zone Zone.bottom assigns
with Top_input -> Zone.top