Module Aorai_utils


module Aorai_utils: sig .. end
exception to avoid pre computation with structure and array*

Given a transition a function and a function status (call or return) it returns if the cross condition can be statisfied with only function status.


val mkStmt : Cil_types.stmtkind -> Cil_types.stmt
val mkStmtOneInstr : Cil_types.instr -> Cil_types.stmt
exception LazyInit
exception to avoid pre computation with structure and array*
val rename_pred : Cil_datatype.Logic_var.t ->
Cil_types.logic_var ->
Cil_types.predicate Cil_types.named -> Cil_types.predicate Cil_types.named
val isCrossable : (Promelaast.typed_condition * 'a) Promelaast.trans ->
Kernel_function.t -> Promelaast.funcStatus -> bool
Given a transition a function name and a function status (call or return) it returns if the cross condition can be statisfied with only function status.
val debug_display_func_status : string -> unit
val get_next : Kernel_function.t ->
Promelaast.funcStatus -> bool array -> bool array * bool array
Given a function name, is status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of reachable states and the second one is the set of crossable transitions.

Given a function, its status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of reachable states and the second one is the set of crossable transitions.

val get_prev : Kernel_function.t ->
Promelaast.funcStatus -> bool array * bool array -> bool array * bool array
Given a function name, its status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of possible initial states and the second one is the set of crossable transitions.

Given a function, its status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of possible initial states and the second one is the set of crossable transitions.

val mk_pre_or_post_bycase_from_pre_or_post : bool array * bool array -> bool array array * bool array array
val debug_display_func_status_bycase : string -> unit
val get_next_bycase : Kernel_function.t ->
Promelaast.funcStatus ->
bool array array -> bool array array * bool array array
Given a function name, is status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of reachable states and the second one is the set of crossable transitions.

Given a function name, is status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of reachable states and the second one is the set of crossable transitions.

val get_prev_bycase : Kernel_function.t ->
Promelaast.funcStatus ->
bool array array * bool array array -> bool array array * bool array array
Given a function name, its status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of possible initial states and the second one is the set of crossable transitions.

Given a function name, is status (call or return) and an array of boolean describing states status, it returns a couple of boolean array. The first one describes the set of possible initial states and the second one is the set of crossable transitions.

val isCrossableAtInit : (Promelaast.typed_condition * 'a) Promelaast.trans ->
Kernel_function.t -> bool
Given a transition a function name and a function status (call or return) it returns if the cross condition can be statisfied with only function status.

Given a transition and the main entry point it returns if the cross condition can be statisfied at the beginning of the program.


Expressions management
val mk_int_exp : int -> Cil_types.exp
Returns an int constant expression which represents the given int value.
val mk_offseted_array_lval : string -> Cil_types.exp -> Cil_types.lval
Returns an lval expression which represents the access of the host_name variable (a string) with the offset off_exp (an expression).
val mk_int_offseted_array_lval : string -> int -> Cil_types.lval
Returns an lval expression which represents the access of the host_name variable (a string) with the offset off_value (an int).
val get_concrete_param_from_formal : String.t ->
Cil_types.varinfo list ->
Cil_types.exp list -> string -> int -> Cil_types.exp_node
val get_concrete_value_of_call : string -> int -> String.t list -> Cil_types.exp_node list
Compute the set of concrete value of a call, associated to a given list of parameters.
Returns a list of exp_node, such that each formal parameter from paramlist is affected by the associated expression.
f : name of the called function
sid : stmt id of the call
paramlist : list of parameters name
val get_concrete_value_of_return : string -> Cil_types.exp_node
Compute the concrete value of a return
Returns an exp_node.
f : name of the called function
val crosscond_to_pred : ?event:Kernel_function.t * Promelaast.funcStatus ->
Promelaast.typed_condition ->
Cil_types.logic_var ->
Cil_types.logic_var -> Cil_types.predicate Cil_types.named
This function rewrites a cross condition into an ACSL expression. Moreover, by giving current operation name and its status (call or return) the generation simplifies the generated expression.

When called with an event (func, call_or_return), the conditions related to a particular event (PCall & co) will be directly evaluated to true or false. When event is None (in particular when generating the invariants), an appropriate predicate is generated.

cross : condition to convert from Promelaast.condition to Cil_types.predicate
op_logic_var : operation variable
status_logic_var : status variable (call/return)

Globals management
val file : Cil_types.file Pervasives.ref
Local copy of the file pointer
val initFile : Cil_types.file -> unit
Copy the file pointer locally in the class in order to ease globals management and initializes some tables.

Copy the file pointer locally in the class in order to easiest globals management and initializes some tables.

val globals_queue : Cil_types.global list Pervasives.ref
List of globals awaiting for adding into C file globals
val flush_globals : unit -> unit
Flush all queued globals declarations into C file globals.
val mk_global : Cil_types.global -> unit
val mk_global_c_initialized_vars : string -> Cil_types.typ -> Cil_types.initinfo -> unit
val mk_global_var : Cil_types.varinfo -> unit
val mk_global_c_vars : string -> Cil_types.typ -> unit
val mk_global_c_var_init : string -> Cil_types.exp -> unit
val mk_int_const : int -> Cil_types.exp
val mk_global_c_initialized_array : string -> int -> Cil_types.initinfo -> unit
val mk_global_c_array : string -> int -> unit
val mk_global_c_int : string -> unit
val mk_global_c_enum_type_tagged : string -> (string * int) list -> Cil_types.enuminfo
val mk_global_c_enum_type : string -> string list -> unit
val mk_global_c_enum : string -> string -> unit
val mk_global_c_initialized_enum : string -> string -> Cil_types.initinfo -> unit

Terms management / computation
val mk_int_term : int -> Cil_types.term
Return an integer constant term from the given value.
val zero_term : unit -> Cil_types.term
Deprecated.use directly Cil.lzero
Return an integer constant term with the 0 value.

Return an integer constant term with the 0 value.

val one_term : unit -> Cil_types.term
val mk_term_from_logic_var : Cil_types.logic_var -> Cil_types.term
Returns a term representing the given logic variable (usually a fresh quantified variable).
val mk_term_from_vi : Cil_types.varinfo -> Cil_types.term
Returns a term representing the variable associated to the given varinfo

Returns a term representing the given logic variable (usually a fresh quantified variable).

val mk_trans_cst : int -> Cil_types.term
val mk_offseted_array : Cil_types.term_lval -> int -> Cil_types.term
Given an lval term 'host' and an integer value 'off', it returns a lval term hostoff.

Given an lval term 'host' and an integer value 'off', it returns a lval term hostoff.

val int2enumstate : int -> Cil_types.term
val mk_offseted_array_states_as_enum : Cil_types.term_lval -> int -> Cil_types.term
Given an lval term 'host' and an integer value 'off', it returns a lval term hostoff.
val mk_offseted_array_lval_from_term : Cil_types.term_lval -> Cil_types.term -> Cil_types.term
Given an lval term 'host' and a term 'term_off', it returns a lval term hostoff.
val mk_offseted_array_lval_from_lval : Cil_types.term_lval -> Cil_types.logic_var -> Cil_types.term
Given an lval term 'host' and a logic variable 'lvar_off', it returns a lval term hostoff. Usually, logic variables stand for fresh quantified variables.
val mk_logic_call : string -> Cil_types.logic_var list -> Cil_types.term
Given the name of a logic and a list of logic variables it returns a call of the logic with variables as parameters.
val host_state_term : unit -> Cil_types.term_lval
Returns a lval term associated to the curState generated variable.

base lhost corresponding to curState.

val state_term : unit -> Cil_types.term
val is_state_pred : Promelaast.state -> Cil_types.predicate Cil_types.named
returns the predicate saying that automaton is in corresponding state.
val is_out_of_state_pred : Promelaast.state -> Cil_types.predicate Cil_types.named
returns the predicate saying that automaton is NOT in corresponding state.
val mk_logicvar_intervalle : Cil_types.logic_var -> int -> int -> Cil_types.predicate Cil_types.named
Given a logic variable and two bounds, it returns the predicate: min<=v<max
val mk_eq_tables : string -> string -> int -> Cil_types.predicate Cil_types.named
Given two names of generated arrays and their size, it returns the predicate: (forall i. 0<=i<size => host1i==host2i)
val mk_valid_range : string -> int -> Cil_types.predicate
Given a name of generated array and its size, it returns the expression: (Valid_range(name,0,size-1)
val mk_global_invariant : Cil_types.predicate Cil_types.named -> string -> unit
val mk_global_comment : string -> unit
val mk_global_logic : string ->
Cil_types.logic_var list ->
Cil_types.logic_type option -> Cil_types.global_annotation
Given
  1. the name of the logic (string),
  2. the list of its genericity parameter names (string),
  3. the list of their type (logic_var),
  4. the type of the function return
  5. and a list of reads tsets, it returns a logic function declaration. A side effect of this function is the registration of this logic into the logics hashtbl from Data_for_aorai.

val mk_global_axiom : string -> Cil_types.predicate -> Cil_types.global_annotation
val mk_global_predicate : string ->
string list ->
Cil_types.logic_var list -> Cil_types.predicate Cil_types.named -> unit

Initialization management / computation
val get_states_trans_init : Kernel_function.t -> Cil_types.initinfo
val func_to_init : string -> Cil_types.initinfo
val funcStatus_to_init : Promelaast.funcStatus -> Cil_types.initinfo
class visit_decl_loops_init : unit -> object .. end
val mk_decl_loops_init : unit -> unit
val change_vars : Cil_types.logic_var Cil_datatype.Logic_var.Hashtbl.t ->
Cil_types.logic_var Kernel_function.Hashtbl.t ->
Kernel_function.Hashtbl.key option ->
Cil_types.logic_label -> Cil_types.predicate -> Cil_types.predicate
val make_prev_pred : Kernel_function.t ->
Promelaast.funcStatus ->
Promelaast.state -> 'a * bool array -> Cil_types.predicate Cil_types.named
given an event (func, status) and a state returns the predicate that guards the transition to this state.
val make_prev_pred_neg : Kernel_function.t ->
Promelaast.funcStatus ->
Promelaast.state list ->
'a * bool array -> Cil_types.predicate Cil_types.named
given an event (func, status) and a state returns the predicate that prevents transition to these states.
val pred_of_condition : Cil_types.logic_var Cil_datatype.Logic_var.Hashtbl.t ->
Cil_types.logic_var Kernel_function.Hashtbl.t ->
Cil_types.logic_label ->
Promelaast.typed_condition -> Cil_types.predicate Cil_types.named
val mk_deterministic_lemma : unit -> unit
val unique_initial_trans : Kernel_function.t -> int option
val make_enum_states : unit -> unit
val getInitialState : unit -> Cil_types.exp
val initGlobals : Kernel_function.t -> bool -> unit
This function computes all newly introduced globals (variables, enumeration structure, invariants, etc.

Given the name of the main function, this function computes all newly introduced globals (variables, enumeration structure, invariants, etc.)


Pre/post management
val mk_abstract_pre_post : 'a list * (Promelaast.typed_condition * 'b) Promelaast.trans list ->
Kernel_function.t -> Promelaast.funcStatus -> bool array * bool array
Function called by mk_abstract_pre and mk_abstract_post.

Pre and post condition of C functions In our point of view, the pre or the post condition of a C function are defined by the set of states authorized just before/after the call, as such as the set of crossable transitions. The following functions generates abstract pre and post-conditions by using only informations deduced from the buchi automata.
val mk_abstract_pre : 'a list * (Promelaast.typed_condition * 'b) Promelaast.trans list ->
Kernel_function.t -> bool array * bool array
Given the buchi automata and the name of a function, it returns two arrays corresponding to the abstract pre-condition.

Given the buchi automata and the name of a function, it returns two arrays corresponding to the abstract pre-condition.

val mk_abstract_post : 'a list * (Promelaast.typed_condition * 'b) Promelaast.trans list ->
Kernel_function.t -> bool array * bool array
Given the buchi automata and the name of a function, it returns two arrays corresponding to the abstract post-condition.

Given the buchi automata and the name of a function, it returns two arrays corresponding to the abstract post-condition.

val pre_post_to_term : bool array * 'a -> Cil_types.predicate Cil_types.named
Generates a term representing the given pre or post condition. Transitions and states are rewritten into predicates in the same manner. The computation is then generalized Conjunction of forbidden and disjunction of authorized are computed together.

Generates a term representing the given pre or post condition, i.e. that the automaton is in one of the states mapped to true.

val pre_post_to_term_neg : bool array * 'a -> Cil_types.predicate Cil_types.named
Generates the negation of the given pre/post, i.e. that the automaton is not in one of the states mapped to true.
val aorai_assigns : Cil_datatype.Location.t -> Cil_types.identified_term Cil_types.assigns
returns assigns clause corresponding to updating automaton's state.
Since Nitrogen-20111001
val action_assigns : ('a * Promelaast.single_action list) Promelaast.trans list ->
Cil_types.identified_term Cil_types.assigns
val force_transition : Cil_types.location ->
Kernel_function.t ->
Promelaast.funcStatus ->
'a * bool array -> Cil_types.identified_predicate list
returns the list of predicates expressing that for each current state the automaton currently is in, there is at least one transition that is crossed.
val mk_action : loc:Cil_datatype.Location.t ->
Promelaast.single_action -> Cil_types.predicate Cil_types.named list
val find_pebble_origin : Cil_types.logic_label -> Promelaast.single_action list -> Cil_types.term
val mk_sub : loc:Cil_types.location ->
Cil_types.term -> Cil_types.logic_var -> Cil_types.predicate Cil_types.named
val pebble_guard : loc:Cil_types.location ->
Cil_types.term ->
Cil_datatype.Logic_var.t ->
Cil_types.predicate Cil_types.named -> Cil_types.predicate Cil_types.named
val pebble_guard_neg : loc:Cil_types.location ->
Cil_types.term ->
Cil_datatype.Logic_var.t ->
Cil_types.predicate Cil_types.named -> Cil_types.predicate Cil_types.named
val pebble_post : loc:Cil_types.location ->
Cil_types.term ->
Cil_datatype.Logic_var.t ->
Cil_types.predicate Cil_types.named -> Cil_types.predicate Cil_types.named
val add_behavior_pebble_actions : loc:Cil_types.location ->
Kernel_function.t * Promelaast.funcStatus ->
(Cil_types.identified_predicate, 'a) Cil_types.behavior list ->
Promelaast.state ->
(Promelaast.typed_condition * Promelaast.single_action list) Promelaast.trans
list -> (Cil_types.identified_predicate, 'a) Cil_types.behavior list
val mk_action : loc:Cil_datatype.Location.t ->
Promelaast.single_action -> Cil_types.predicate Cil_types.named list
val mk_behavior : loc:Cil_types.location ->
'a *
(Promelaast.typed_condition * Promelaast.single_action list) Promelaast.trans
list ->
Kernel_function.t * Promelaast.funcStatus ->
bool array * bool array ->
Promelaast.state ->
(Cil_types.identified_predicate, 'b) Cil_types.behavior list
val auto_func_behaviors : Cil_types.location ->
Kernel_function.t ->
Promelaast.funcStatus ->
bool array * bool array ->
(Cil_types.identified_predicate, Cil_types.identified_term)
Cil_types.behavior list
auto_func_behaviors f st (st_status, tr_status) generates behaviors corresponding to the transitions authorized by tr_status for function f in status st
Since Nitrogen-20111001
val get_preds_wrt_params : bool array ->
Kernel_function.t ->
Promelaast.funcStatus -> Cil_types.predicate Cil_types.named option
val get_preds_pre_wrt_params : Kernel_function.t -> Cil_types.predicate Cil_types.named option
val get_preds_post_bc_wrt_params : Kernel_function.t -> Cil_types.predicate Cil_types.named option
val force_condition_to_predicate : bool array * 'a -> bool array * 'b -> Cil_types.predicate Cil_types.named
val treat_val : Cil_types.term ->
Cil_types.predicate Cil_types.named ->
Cil_types.term * Data_for_aorai.range -> Cil_types.predicate Cil_types.named
val update_to_pred : Promelaast.state ->
Cil_types.term * (Cil_types.term * Data_for_aorai.range) list ->
Cil_types.predicate Cil_types.named
val action_to_pred : pre_state:Promelaast.state ->
post_state:Promelaast.state ->
Kernel_function.t -> Cil_types.predicate Cil_types.named list
for a given kf, a starting and ending state, returns the post-conditions related to the possible values of the auxiliary variables at the exit of the function.
val get_global_loop_inv : Cil_types.stmt -> bool array * bool array
val get_restricted_int_pre_bc : Cil_types.stmt -> Cil_types.predicate Cil_types.named
val get_restricted_ext_pre_bc : Cil_types.stmt -> Cil_types.predicate Cil_types.named
val get_restricted_int_post_bc : Cil_types.stmt -> Cil_types.predicate Cil_types.named
val display : string -> unit
val display_operations_spec__ : bool -> bool -> unit
Intermediate function that factorizes some functionalities. This function is designed to be internally called.
val display_operations_spec : unit -> unit
Some displaying functions
val display_operations_spec_bycase : unit -> unit
val display_operations_spec_sorted : unit -> unit
val display_operations_spec_sorted_bycase : unit -> unit
val debug_display_all_specs : unit -> unit
val pasEtatOp : string -> string -> unit
val pasEtatAvantOp : string -> unit
val pasEtatApresOp : string -> unit
val pasEtatLoop : string -> string -> int -> unit
val pasEtatAvantLoop : int -> unit
val pasEtatApresLoop : int -> unit
val pasEtatAvantLoopBlock : int -> unit
val pasEtatApresLoopBlock : int -> unit
val display_all_warnings_about_operations_specs : unit -> unit
val display_all_warnings_about_loops_specs : unit -> unit
val display_all_warnings_about_specs : unit -> unit