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, _ | FalseUnknown ->
                change_status status_maybe;
                "unknown", state
            | True, _ ->
                change_status status_true;
                "valid", state
            | FalseTrue ->
                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 _ (*TODO*)
    | AVariant _ | AAssigns _
    | AStmtSpec _ (*TODO*) -> state