package frama-c
Install
dune-project
Dependency
Authors
-
MMichele Alberti
-
TThibaud Antignac
-
GGergö Barany
-
PPatrick Baudin
-
NNicolas Bellec
-
TThibaut Benjamin
-
AAllan Blanchard
-
LLionel Blatter
-
FFrançois Bobot
-
RRichard Bonichon
-
VVincent Botbol
-
QQuentin Bouillaguet
-
DDavid Bühler
-
ZZakaria Chihani
-
SSylvain Chiron
-
LLoïc Correnson
-
JJulien Crétin
-
PPascal Cuoq
-
ZZaynah Dargaye
-
BBasile Desloges
-
JJean-Christophe Filliâtre
-
PPhilippe Herrmann
-
MMaxime Jacquemin
-
BBenjamin Jorge
-
FFlorent Kirchner
-
AAlexander Kogtenkov
-
RRemi Lazarini
-
TTristan Le Gall
-
KKilyan Le Gallic
-
JJean-Christophe Léchenet
-
MMatthieu Lemerre
-
DDara Ly
-
DDavid Maison
-
CClaude Marché
-
AAndré Maroneze
-
TThibault Martin
-
FFonenantsoa Maurica
-
MMelody Méaulle
-
BBenjamin Monate
-
YYannick Moy
-
PPierre Nigron
-
AAnne Pacalet
-
VValentin Perrelle
-
GGuillaume Petiot
-
DDario Pinto
-
VVirgile Prevosto
-
AArmand Puccetti
-
FFélix Ridoux
-
VVirgile Robles
-
JJan Rochel
-
MMuriel Roger
-
CCécile Ruet-Cros
-
JJulien Signoles
-
NNicolas Stouls
-
KKostyantyn Vorobyov
-
BBoris Yakobowski
Maintainers
Sources
sha256=a94384f00d53791cbb4b4d83ab41607bc71962d42461f02d71116c4ff6dca567
doc/frama-c.kernel/Frama_c_kernel/Interpreted_automata/UnrollUnnatural/index.html
Module Interpreted_automata.UnrollUnnatural
Control flow graphs where unnatural loops are modified such that all paths entering a loop enters it by its head.
module Vertex_Set : Datatype.S_with_collections with type t = Vertex.Set.tmodule Version :
Datatype.S_with_collections with type t = Vertex.t * Vertex.Set.tinclude Graph
with type V.t = Version.t
and type E.t = Version.t * Version.t edge * Version.t
and type V.label = Version.t
and type E.label = Version.t edge
include Graph.Sig.I
with type V.t = Version.t
with type E.t = Version.t * Version.t edge * Version.t
with type V.label = Version.t
with type E.label = Version.t edge
An imperative graph is a graph.
include Graph.Sig.G
with type V.t = Version.t
with type E.t = Version.t * Version.t edge * Version.t
with type V.label = Version.t
with type E.label = Version.t edge
Graph structure
Vertices have type V.t and are labeled with type V.label (note that an implementation may identify the vertex with its label)
type vertex = V.tmodule E :
Graph.Sig.EDGE
with type vertex = vertex
with type t = Version.t * Version.t edge * Version.t
with type label = Version.t edgeEdges have type E.t and are labeled with type E.label. src (resp. dst) returns the origin (resp. the destination) of a given edge.
type edge = E.tSize functions
val is_empty : t -> boolval nb_vertex : t -> intval nb_edges : t -> intDegree of a vertex
Membership functions
find_edge g v1 v2 returns the edge from v1 to v2 if it exists. Unspecified behaviour if g has several edges from v1 to v2.
find_all_edges g v1 v2 returns all the edges from v1 to v2.
Successors and predecessors
You should better use iterators on successors/predecessors (see Section "Vertex iterators").
Labeled edges going from/to a vertex
Graph iterators
Iter on all edges of a graph. Edge label is ignored.
Fold on all edges of a graph. Edge label is ignored.
Map on all vertices of a graph.
The current implementation requires the supplied function to be injective. Said otherwise, map_vertex cannot be used to contract a graph by mapping several vertices to the same vertex. To contract a graph, use instead create, add_vertex, and add_edge.
Vertex iterators
Each iterator iterator f v g iters f to the successors/predecessors of v in the graph g and raises Invalid_argument if v is not in g. It is the same for functions fold_* which use an additional accumulator.
<b>Time complexity for ocamlgraph implementations:</b> operations on successors are in O(1) amortized for imperative graphs and in O(ln(|V|)) for persistent graphs while operations on predecessors are in O(max(|V|,|E|)) for imperative graphs and in O(max(|V|,|E|)*ln|V|) for persistent graphs.
iter/fold on all successors/predecessors of a vertex.
iter/fold on all edges going from/to a vertex.
val create : ?size:int -> unit -> tcreate () returns an empty graph. Optionally, a size can be given, which should be on the order of the expected number of vertices that will be in the graph (for hash tables-based implementations). The graph grows as needed, so size is just an initial guess.
val clear : t -> unitRemove all vertices and edges from the given graph.
copy g returns a copy of g. Vertices and edges (and eventually marks, see module Mark) are duplicated.
add_vertex g v adds the vertex v to the graph g. Do nothing if v is already in g.
remove g v removes the vertex v from the graph g (and all the edges going from v in g). Do nothing if v is not in g.
<b>Time complexity for ocamlgraph implementations:</b> O(|V|*ln(D)) for unlabeled graphs and O(|V|*D) for labeled graphs. D is the maximal degree of the graph.
add_edge g v1 v2 adds an edge from the vertex v1 to the vertex v2 in the graph g. Add also v1 (resp. v2) in g if v1 (resp. v2) is not in g. Do nothing if this edge is already in g.
add_edge_e g e adds the edge e in the graph g. Add also E.src e (resp. E.dst e) in g if E.src e (resp. E.dst e) is not in g. Do nothing if e is already in g.
remove_edge g v1 v2 removes the edge going from v1 to v2 from the graph g. If the graph is labelled, all the edges going from v1 to v2 are removed from g. Do nothing if this edge is not in g.
module VTable : FCHashtbl.S with type key = vertextype wto = vertex Wto.partitionval pretty : t Pretty_utils.formatterBuild a wto for the given automaton. The pref function is a comparison function used to determine what is the best vertex to use as a Wto component head. See Wto.Make for more details.
val output_to_dot :
?pp_vertex:V.t Pretty_utils.formatter ->
?pp_edge:E.label Pretty_utils.formatter ->
?wto:wto ->
out_channel ->
t ->
unitOutput the automaton in dot format
val exit_strategy : t -> V.t Wto.component -> wtoExtract an exit strategy from a component, i.e. a sub-wto where all vertices lead outside the wto without passing through the head.
module type Domain = sig ... endAbstract domains
module ForwardAnalysis (D : Domain) : sig ... endForward dataflow analysis
module BackwardAnalysis (D : Domain) : sig ... endForward dataflow analysis
val build : automaton -> G.vertex Wto.partition -> WTOIndex.Table.t -> t