Module Sets

module Sets: sig .. end

PDG (program dependence graph) access functions.

Provides function to extract information from the PDG.


type nodes_and_undef = (PdgTypes.Node.t * Locations.Zone.t option) list * Locations.Zone.t option 

PDG nodes for some elements

val find_stmt_node : PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t
val find_simple_stmt_nodes : PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t list

notice that there can be several nodes if the statement is a call. For If, Switch, ... the node represent only the condition (see find_stmt_nodes below).

val find_stmt_and_blocks_nodes : PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t list

notice that there can be several nodes if the statement is a call. If the stmt is a composed instruction (block, etc), all the nodes of the enclosed statements are considered.

val find_location_nodes_at_stmt : PdgTypes.Pdg.t ->
Cil_types.stmt -> before:bool -> Locations.Zone.t -> nodes_and_undef
val find_location_nodes_at_end : PdgTypes.Pdg.t -> Locations.Zone.t -> nodes_and_undef
val find_location_nodes_at_begin : PdgTypes.Pdg.t -> Locations.Zone.t -> nodes_and_undef
val find_label_node : PdgTypes.Pdg.t -> Cil_types.stmt -> Cil_types.label -> PdgTypes.Node.t
val find_decl_var_node : PdgTypes.Pdg.t -> Cil_types.varinfo -> PdgTypes.Node.t
val find_input_node : PdgTypes.Pdg.t -> int -> PdgTypes.Node.t
val find_output_node : PdgTypes.Pdg.t -> PdgTypes.Node.t
val find_all_input_nodes : PdgTypes.Pdg.t -> PdgTypes.Node.t list
val find_entry_point_node : PdgTypes.Pdg.t -> PdgTypes.Node.t
val find_top_input_node : PdgTypes.Pdg.t -> PdgTypes.Node.t
val find_output_nodes : PdgTypes.Pdg.t -> PdgIndex.Signature.out_key -> nodes_and_undef
val find_call_ctrl_node : PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t
val find_call_num_input_node : PdgTypes.Pdg.t -> Cil_types.stmt -> int -> PdgTypes.Node.t
val find_call_input_nodes : PdgTypes.Pdg.t ->
Cil_types.stmt -> PdgIndex.Signature.in_key -> nodes_and_undef
val find_call_output_node : PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t
val find_call_stmts : Cil_types.kernel_function ->
caller:Cil_types.kernel_function -> Cil_types.stmt list
val find_call_out_nodes_to_select : PdgTypes.Pdg.t ->
PdgTypes.NodeSet.t ->
PdgTypes.Pdg.t -> Cil_types.stmt -> PdgTypes.Node.t list
val find_in_nodes_to_select_for_this_call : PdgTypes.Pdg.t ->
PdgTypes.NodeSet.t ->
Cil_types.stmt -> PdgTypes.Pdg.t -> PdgTypes.Node.t list
val direct_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list

direct dependencies only: This means the nodes that have an edge to the given node.

gives the list of nodes that the given node depends on, without looking at the kind of dependency.

val direct_data_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val direct_ctrl_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val direct_addr_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list

transitive closure

val find_nodes_all_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t list -> PdgTypes.Node.t list
val find_nodes_all_data_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t list -> PdgTypes.Node.t list
val find_nodes_all_ctrl_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t list -> PdgTypes.Node.t list
val find_nodes_all_addr_dpds : PdgTypes.Pdg.t -> PdgTypes.Node.t list -> PdgTypes.Node.t list

forward

val direct_uses : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val direct_data_uses : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val direct_ctrl_uses : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val direct_addr_uses : PdgTypes.Pdg.t -> PdgTypes.Node.t -> PdgTypes.Node.t list
val all_uses : PdgTypes.Pdg.t -> PdgTypes.Node.t list -> PdgTypes.Node.t list

others

val custom_related_nodes : (PdgTypes.Node.t -> PdgTypes.Node.t list) ->
PdgTypes.Node.t list -> PdgTypes.Node.t list