Module WpAnnot


module WpAnnot: sig .. end
This file groups functions that extract some annotations and associates them with CFG edges.

Every access to annotations have to go through here, so this is the place where we decide what the computation is allowed to use.


module CFG: Cil2cfg.CFG

type prop_kind =
| PKfctPre of Cil_types.identified_predicate
| PKspecPre of Cil_types.stmt * Cil_types.identified_predicate
| PKfctPost of Cil_types.identified_predicate
| PKspecPost of Cil_types.stmt * Cil_types.identified_predicate
| PKloopInv of Cil_types.stmt * int * Cil_types.predicate Cil_types.named
| PKassert of int * bool * Cil_types.stmt * Cil_types.predicate Cil_types.named
| PKbhvProp of string * Cil_types.predicate Cil_types.named
val prop_txt : prop_kind -> string
val pp_id : Format.formatter -> prop_kind -> unit
val compare_prop_id : prop_kind -> prop_kind -> int
val prop_named_pred : prop_kind -> Cil_types.predicate Cil_types.named
type prop_type = prop_kind * Cil_types.predicate Cil_types.named 
val pred_of_prop : 'a * 'b -> 'b
val id_of_prop : 'a * 'b -> 'a
module Hannots: Cil2cfg.HE(sig
type t = WpAnnot.prop_type list * WpAnnot.prop_type list 
end)
This is an Hashtbl where some predicates are stored on CFG edges.

type annot_kind =
| Agoal
| Ahyp

type t = {
   behavior_name : string option;
   find_hyps : CFG.E.t -> prop_type list;
   find_goals : CFG.E.t -> prop_type list;
   find_loop_assigns : CFG.E.t -> Cil_types.identified_term Cil_types.assigns list;
   called_preconditions : Kernel_function.t -> Cil_types.predicate Cil_types.named list;
   called_postconditions : Kernel_function.t -> Cil_types.predicate Cil_types.named list;
   called_assigns : Kernel_function.t -> Cil_types.identified_term Cil_types.assigns list;
}
an object of this type is the only acces to annotations from the rest of the application. The idea is to be able to tune which properties to use for a computation.
val add : NormAtLabels.label_mapping ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
prop_kind ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_behaviors_spec : string ->
Cil_types.predicate Cil_types.named ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_fct_pre : Cil_types.identified_predicate ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_stmt_spec_pre : Cil_types.stmt ->
Cil_types.identified_predicate ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_fct_post : Cil_types.identified_predicate ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_stmt_spec_post : Cil_types.stmt ->
Cil_types.identified_predicate ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_inv : Cil_types.stmt ->
int ->
Cil_types.predicate Cil_types.named ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_annot : bool ->
Cil_types.stmt ->
int ->
Cil_types.predicate Cil_types.named ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_assigns : string ->
NormAtLabels.label_mapping ->
Cil_types.identified_term Cil_types.assigns list ->
Cil_types.identified_term Cil_types.assigns ->
Cil_types.identified_term Cil_types.assigns list
val get_behav : string ->
('a, 'b) Cil_types.behavior list -> ('a, 'b) Cil_types.behavior option
val test_behav : string -> string list -> bool
val add_spec_pre : Cil_types.stmt option ->
string option ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
('a, Cil_types.identified_predicate, 'b) Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_spec_post : Cil_types.stmt option ->
string option ->
(prop_kind * Cil_types.predicate Cil_types.named) list ->
('a, Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_stmt_spec : string ->
(prop_kind * Cil_types.predicate Cil_types.named) list *
(prop_kind * Cil_types.predicate Cil_types.named) list ->
Cil_types.stmt ->
('a, Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list *
(prop_kind * Cil_types.predicate Cil_types.named) list
val get_ext_preconditions : ('a, Cil_types.identified_predicate, 'b) Cil_types.spec ->
Cil_types.predicate Cil_types.named list
val get_ext_postconditions : ('a, Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.spec -> Cil_types.predicate Cil_types.named list
val get_preconditions : string ->
('a, Cil_types.identified_predicate, 'b) Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val get_postconditions : string ->
('a, Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val pp_bhv_names : (unit, Format.formatter, unit, unit, unit, unit) format6 ->
string list Pretty_utils.formatter
val get_bhv_assumes : ('a, Cil_types.identified_predicate, 'b) Cil_types.spec ->
string list -> Cil_types.predicate Cil_types.named list
val disjoint_behaviors_props : bool -> ('a, 'b, 'c) Cil_types.spec -> 'd list
val complet_behaviors_props : bool ->
('a, Cil_types.identified_predicate, 'b) Cil_types.spec ->
(prop_kind * Cil_types.predicate Cil_types.named) list
val add_code_annot : bool ->
Cil_types.stmt ->
string ->
Db_types.rooted_code_annotation ->
(prop_kind * Cil_types.predicate Cil_types.named) list *
(prop_kind * Cil_types.predicate Cil_types.named) list ->
(prop_kind * Cil_types.predicate Cil_types.named) list *
(prop_kind * Cil_types.predicate Cil_types.named) list
val get_stmt_annots : string ->
Cil_types.stmt ->
(prop_kind * Cil_types.predicate Cil_types.named) list *
(prop_kind * Cil_types.predicate Cil_types.named) list
val get_loop_invariant : string ->
Cil_types.stmt ->
(prop_kind * Cil_types.predicate Cil_types.named) list
Have to process every AInvariant even if it is only to emit an alarm
val get_loop_assigns : string -> CFG.E.t -> Cil_types.identified_term Cil_types.assigns list
the edge e is the one that is going into the loop.
val add_bhv_fct_assigns : Cil_types.identified_term Cil_types.assigns list ->
('a, Cil_types.identified_term) Cil_types.behavior ->
Cil_types.identified_term Cil_types.assigns list
val get_fct_assigns : string ->
('a, 'b, Cil_types.identified_term) Cil_types.spec ->
Cil_types.identified_term Cil_types.assigns list
val get_ext_fct_assigns : ('a, 'b, Cil_types.identified_term) Cil_types.spec ->
Cil_types.identified_term Cil_types.assigns list
val get_spec : Kernel_function.t -> Cil_types.funspec
the definitions are saying that if a formal parameter x appears in a postcondition, it has to be understood as \old(x). So, let's change the formals x by \old(x) in ensures clauses.
val get_bhv_annots : ('a, 'b) Cil_types.behavior option -> Cil2cfg.t -> t
builds tables that give hypotheses and goals relative to b behavior for edges of the cfg to consider during wp computation. b = None means that we only consider internal properties to select for the default behavior. This is useful when the function doesn't have any specification.
val get_behavior_annots : string -> Cil2cfg.t -> t option
Returns None when there is no behavior with the given name
val get_all_annots : Cil2cfg.t -> t list
return one environment per behavior