Free_algebra.Classical
Represent an abstract state as a free algebra (each function is a constructor) We use hash-consing to speed up comparisons and set operations
We can easily turn this into a functor that doesn't know anything about the relation type Relation.t
being used. However, doing so prevents us from easily counting assertions in the resulting graph.
Its command line id is FA
.
module StateNode : sig ... end
The type of states: a free algebra of the domain signature
module State :
Std_extra.Types.TYPE with type t = StateNode.t Hashconsing.hash_consed
States are just hash-consed nodes
module StateSet : Std_extra.Types.SET with type elt = State.t
Set of states
include Sig.Classical_Domain
with type relation = Ast.Program.Relation.t
and module State := State
and module StateSet := StateSet
include Sig.Doc
type relation = Ast.Program.Relation.t
program relations (edges in the CFG), typically Ast.Program.relation
val join : StateSet.t -> State.t option
joins the states given as arguments
None
on emptysetval entrypoint : Ast.Program.Var.t list -> State.t
entrypoint
take the list of variables bound at the start of the program as argument, and returns the abstraction for the program entry
val join_and_widen :
Ast.Program.Loc.t ->
State.t ->
StateSet.t ->
State.t option
join_and_widen l old set
is widen loc old (join set)
Merged in a single operation as it avoids renamings in SSA.Lift
val is_included : Ast.Program.Loc.t -> State.t -> State.t -> bool
State inclusion operation used to detect convergence. This was absent from the paper
val query_truth_value :
(State.t ->
Ast.Program.VarExpr.t ->
Single_value_abstraction.Ternary.t)
option
Possible truth value of the given expression. None
when the domain provides no useful data
val query_is_constant : (State.t -> Ast.Program.VarExpr.t -> Z.t option) option
query_is_constant state expr
is Some z
only if we can prove that expr
is equal to constant z
in the given state. None
when the domain provides no useful data