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 =
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
end
)
This is an Hashtbl where some predicates are stored on CFG edges.
type
annot_kind =
type
t = {
}
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