Module 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

States are just hash-consed nodes

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
val id : string

Unique identifier for the domain, eg "N", "FA",...

val name : Stdlib.Format.formatter -> unit -> unit

Full human readable name

val state_name : string

Name of the domain's states

val doc : string

Long description of the domain

type relation = Ast.Program.Relation.t

program relations (edges in the CFG), typically Ast.Program.relation

val apply : relation -> State.t -> State.t option

None means state is unreacheble (eg: if false ...)

  • raises Division_by_zero
val join : StateSet.t -> State.t option

joins the states given as arguments

  • None on emptyset
  • single element on singleton
val 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

Queries

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

module Graph : Sig.Graph with type state = State.t

Generate the graph from psharp, we use a cast function as argument to allow Psharp to have a different type. This is useful when this domain is part of a product in the analysis.