let compute_actual ~with_alarms (one_library_fun, all_library_funs) state e =
let interpreted_expr, o = match e with
| { enode = Lval l }
when not (is_bitfield l ()) ->
let _, _, interpreted_expr =
eval_lval ~conflate_bottom:false ~with_alarms None state l
in
if one_library_fun then
ignore (eval_lval ~conflate_bottom:true ~with_alarms None state l);
if V.is_bottom interpreted_expr
then begin
if not one_library_fun then
ignore (eval_lval ~conflate_bottom:true ~with_alarms None state l);
if all_library_funs
then begin
Value_parameters.result ~current:true
"Non-termination@ in@ evaluation@ of@ library function@ call@ lvalue@ argument@ @[%a@]" (!d_lval) l;
end;
raise Got_bottom;
end;
let r = do_cast ~with_alarms (typeOf e) interpreted_expr in
let o = offsetmap_of_lv ~with_alarms state l in
(match o with
| Some o -> r, o
| None ->
Format.printf "failure in evaluation of function arguments@\nlval %a -> %a@." !d_lval l V.pretty interpreted_expr;
assert false)
| _ ->
let interpreted_expr = eval_expr ~with_alarms state e in
if V.is_bottom interpreted_expr
then begin
Value_parameters.result ~current:true
"Non-termination@ in@ evaluation@ of@ function@ call@ expression@ argument@ @[%a@]"
(!d_exp) e;
raise Got_bottom
end;
let typ = Cil.typeOf e in
interpreted_expr,
Builtins.offsetmap_of_value ~typ interpreted_expr
in
e, interpreted_expr, o