Module InferModules.AbstractDomain

module Types : sig ... end
exception Stop_analysis

This exception can be raised by abstract interpreters to stop the analysis early without triggering further errors. Clients who raise this exception should catch it eventually.

module type NoJoin = sig ... end
module type S = sig ... end
include sig ... end
module Empty : S with type t = unit

a trivial domain

module type WithBottom = sig ... end

A domain with an explicit bottom value

module type WithTop = sig ... end

A domain with an explicit top value

module BottomLifted : functor (Domain : S) -> sig ... end

Create a domain with Bottom element from a pre-domain

module BottomLiftedUtils : sig ... end
module TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_lifted

Create a domain with Top element from a pre-domain

module TopLiftedUtils : sig ... end
module Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.t

Cartesian product of two domains.

module Flat : functor (V : InferStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... end

Flat abstract domain: Bottom, Top, and non-comparable elements in between

include sig ... end
module Stacked : functor (Below : S) -> functor (Above : S) -> S with type t = (Below.tAbove.t) Types.below_above

Stacked abstract domain: tagged union of Below and Above domains where all elements of Below are strictly smaller than elements of Above

module StackedUtils : sig ... end
module MinReprSet : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end

Abstracts a set of Elements by keeping its smallest representative only. The widening is terminating only if the order fulfills the descending chain condition.

module type FiniteSetS = sig ... end
include sig ... end
module FiniteSetOfPPSet : functor (PPSet : InferStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.elt

Lift a PPSet to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union.

module FiniteSet : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.t

Lift a set to a powerset domain ordered by subset. The elements of the set should be drawn from a *finite* collection of possible values, since the widening operator here is just union.

module type InvertedSetS = sig ... end
module InvertedSet : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.t

Lift a set to a powerset domain ordered by superset, so the join operator is intersection

module type MapS = sig ... end
include sig ... end
module MapOfPPMap : functor (PPMap : InferStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.t

Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else. Uses PPMap as the underlying map

module Map : functor (Key : InferStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.t

Map domain ordered by union over the set of bindings, so the bottom element is the empty map. Every element implicitly maps to bottom unless it is explicitly bound to something else

module type InvertedMapS = sig ... end
module InvertedMap : functor (Key : InferStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.t

Map domain ordered by intersection over the set of bindings, so the top element is the empty map. Every element implictly maps to top unless it is explicitly bound to something else

module BooleanAnd : S with type t = bool

Boolean domain ordered by p || ~q. Useful when you want a boolean that's true only when it's true in both conditional branches.

module BooleanOr : WithBottom with type t = bool

Boolean domain ordered by ~p || q. Useful when you want a boolean that's true only when it's true in one conditional branch.

module type MaxCount = sig ... end
module CountDomain : functor (MaxCount : MaxCount) -> sig ... end

Domain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented

module StackDomain : functor (Element : InferStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... end

Domain whose members are stacks of elements (lists, last pushed is head of the list), partially ordered by the prefix relation (c;b;a <= b;a), and whose join computes the longest common prefix (so c;b;a join f;g;b;c;a = a), so the top element is the empty stack.