Module InferModules.RacerDDomain

module F = Stdlib.Format
module Access : sig ... end
module TraceElem : sig ... end
module LocksDomain : sig ... end

Overapproximation of number of locks that are currently held

module ThreadsDomain : sig ... end

Abstraction of threads that may run in parallel with the current thread. NoThread < AnyThreadExceptSelf < AnyThread

module AccessSnapshot : sig ... end

snapshot of the relevant state at the time of a heap access: concurrent thread(s), lock(s) held, ownership precondition

module AccessDomain : sig ... end

map of access metadata |-> set of accesses. the map should hold all accesses to a possibly-unowned access path

module OwnershipAbstractValue : sig ... end
module OwnershipDomain : sig ... end
module Choice : sig ... end

attribute attached to a boolean variable specifying what it means when the boolean is true

module Attribute : sig ... end
module AttributeSetDomain : sig ... end
module AttributeMapDomain : sig ... end
type t = {
threads : ThreadsDomain.t;

current thread: main, background, or unknown

locks : LocksDomain.t;

boolean that is true if a lock must currently be held

accesses : AccessDomain.t;

read and writes accesses performed without ownership permissions

ownership : OwnershipDomain.t;

map of access paths to ownership predicates

attribute_map : AttributeMapDomain.t;

map of access paths to attributes such as owned, functional, ...

}
type summary = {
threads : ThreadsDomain.t;
locks : LocksDomain.t;
accesses : AccessDomain.t;
return_ownership : OwnershipAbstractValue.t;
return_attributes : AttributeSetDomain.t;
}

same as astate, but without attribute_map (since these involve locals) and with the addition of the ownership/attributes associated with the return value as well as the set of formals which may escape

val empty_summary : summary
include AbstractDomain.WithBottom with type t := t
include AbstractDomain.S
include AbstractDomain.NoJoin
val (<=) : lhs:t -> rhs:t -> bool

the implication relation: lhs <= rhs means lhs |- rhs

val join : t -> t -> t
val widen : prev:t -> next:t -> num_iters:int -> t
val bottom : t

The bottom value of the domain.

val is_bottom : t -> bool

Return true if this is the bottom value

val pp_summary : F.formatter -> summary -> unit
val add_unannotated_call_access : InferIR.Typ.Procname.t -> InferBase.Location.t -> InferIR.Procdesc.t -> t -> t