Module Absint__AbstractDomain
Abstract domains and domain combinators
module Types : sig ... endmodule type NoJoin = sig ... endmodule type S = sig ... endmodule type WithBottom = sig ... endA domain with an explicit bottom value
module type WithTop = sig ... endA domain with an explicit top value
module BottomLifted : functor (Domain : S) -> sig ... endCreate a domain with Bottom element from a pre-domain
module BottomLiftedUtils : sig ... endmodule TopLifted : functor (Domain : S) -> WithTop with type t = Domain.t Types.top_liftedCreate a domain with Top element from a pre-domain
module TopLiftedUtils : sig ... endmodule Pair : functor (Domain1 : S) -> functor (Domain2 : S) -> S with type t = Domain1.t * Domain2.tCartesian product of two domains.
module Flat : functor (V : IStdlib.PrettyPrintable.PrintableEquatableType) -> sig ... endFlat abstract domain: Bottom, Top, and non-comparable elements in between
include sig ... end
module Stacked : functor (Below : S) -> functor (Val : S) -> functor (Above : S) -> S with type t = (Below.t, Val.t, Above.t) Types.below_aboveStacked abstract domain: tagged union of
Below,Val, andAbovedomains where all elements ofBeloware strictly smaller than all elements ofValwhich are strictly smaller than all elements ofAbove
module StackedUtils : sig ... endmodule MinReprSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... endAbstracts 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 ... endinclude sig ... end
module FiniteSetOfPPSet : functor (PPSet : IStdlib.PrettyPrintable.PPSet) -> FiniteSetS with type FiniteSetOfPPSet.elt = PPSet.eltLift 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 : IStdlib.PrettyPrintable.PrintableOrderedType) -> FiniteSetS with type FiniteSet.elt = Element.tLift 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 ... endmodule InvertedSet : functor (Element : IStdlib.PrettyPrintable.PrintableOrderedType) -> InvertedSetS with type InvertedSet.elt = Element.tLift a set to a powerset domain ordered by superset, so the join operator is intersection
module type MapS = sig ... endinclude sig ... end
module MapOfPPMap : functor (PPMap : IStdlib.PrettyPrintable.PPMap) -> functor (ValueDomain : S) -> MapS with type key = PPMap.key and type value = ValueDomain.t and type t = ValueDomain.t PPMap.tMap 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 : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> MapS with type key = Key.t and type value = ValueDomain.tMap 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 ... endmodule InvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : S) -> InvertedMapS with type key = Key.t and type value = ValueDomain.tMap 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 SafeInvertedMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (ValueDomain : WithTop) -> InvertedMapS with type key = Key.t and type value = ValueDomain.tSimilar to
InvertedMapbut it guarantees that it has a canonical form. For example, both{a -> top_v}andemptyrepresent the same abstract valuetopinInvertedMap, but in this implementation,topis always implemented asemptyby not adding thetop_vexplicitly.
include sig ... end
module FiniteMultiMap : functor (Key : IStdlib.PrettyPrintable.PrintableOrderedType) -> functor (Value : IStdlib.PrettyPrintable.PrintableOrderedType) -> sig ... endmodule BooleanAnd : S with type t = boolBoolean 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 = boolBoolean 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 ... endmodule CountDomain : functor (MaxCount : MaxCount) -> sig ... endDomain keeping a non-negative count with a bounded maximum value. The count can be only incremented and decremented.
module DownwardIntDomain : functor (MaxCount : MaxCount) -> sig ... endDomain keeping a non-negative count with a bounded maximum value.
joinis minimum andtopis zero.