let interp_annot state stmt ca =
match ca.annot_content with
| AAssert (behav,p) ->
let in_behavior =
match behav with
[] -> True
| [ behav ] ->
let initial_state_single =
State_set.join AnalysisParam.initial_state in
let _valid_behaviors =
valid_behaviors
(current_kf())
initial_state_single
in
if List.exists (fun b -> b.b_name = behav) _valid_behaviors
then Unknown
else False
| _ -> Unknown
in
if in_behavior = False
then state
else
let result = eval_predicate ~result:None ~old:None state p in
let ip = Property.ip_of_code_annot (current_kf()) stmt ca in
let change_status st = List.iter (swap Status.join st) ip in
let message, result =
(match result, in_behavior with
| Unknown, _ | False, Unknown ->
change_status status_maybe;
"unknown", state
| True, _ ->
change_status status_true;
"valid", state
| False, True ->
change_status status_false;
"invalid (stopping propagation).", State_set.empty
| _, False -> assert false)
in
let result =
if in_behavior = True
then
reduce_by_disjunction ~result:None ~old:None
result
AnalysisParam.slevel
p
else result
in
Value_parameters.result ~once:true ~current:true
"Assertion got status %s." message;
result
| APragma _
| AInvariant _
| AVariant _ | AAssigns _
| AStmtSpec _ -> state