Module InferModules.StarvationDomain

module F = Stdlib.Format
module Lock : sig ... end

Abstraction of a path that represents a lock, special-casing equality and comparisons to work over type, base variable modulo this and access list

module Event : sig ... end

Represents the existence of a program path from the current method to the eventual acquisition of a lock or a blocking call. Equality/comparison disregards the call trace but includes location.

module EventDomain : ExplicitTrace.FiniteSet with type FiniteSet.elt = Event.t
module Order : sig ... end

Represents the existence of a program path to the first lock being taken in the current method or, transitively, a callee *in the same class*, and, which continues (to potentially another class) until the eventually event, schematically -->first-->eventually. It is guaranteed that during the second part of the trace (first-->eventually) the lock first is not released.

module OrderDomain : ExplicitTrace.FiniteSet with type FiniteSet.elt = Order.t
module LockState : AbstractDomain.WithTop
module UIThreadExplanationDomain : sig ... end
module UIThreadDomain : AbstractDomain.WithBottom with type t = UIThreadExplanationDomain.t AbstractDomain.Types.bottom_lifted
module GuardToLockMap : AbstractDomain.WithTop
type t = {
events : EventDomain.t;
guard_map : GuardToLockMap.t;
lock_state : LockState.t;
order : OrderDomain.t;
ui : UIThreadDomain.t;
}
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 acquire : InferIR.Tenv.t -> t -> InferBase.Location.t -> Lock.t list -> t

simultaneously acquire a number of locks, no-op if list is empty

val release : t -> Lock.t list -> t

simultaneously release a number of locks, no-op if list is empty

val blocking_call : InferIR.Typ.Procname.t -> Event.severity_t -> InferBase.Location.t -> t -> t
val strict_mode_call : InferIR.Typ.Procname.t -> InferBase.Location.t -> t -> t
val set_on_ui_thread : t -> InferBase.Location.t -> string -> t

set the property "runs on UI thread" to true by attaching the given explanation string as to why this method is thought to do so

val add_guard : InferIR.Tenv.t -> t -> InferIR.HilExp.t -> Lock.t -> acquire_now:bool -> InferBase.Location.t -> t

Install a mapping from the guard expression to the lock provided, and optionally lock it.

val lock_guard : InferIR.Tenv.t -> t -> InferIR.HilExp.t -> InferBase.Location.t -> t

Acquire the lock the guard was constructed with.

val remove_guard : t -> InferIR.HilExp.t -> t

Destroy the guard and release its lock.

val unlock_guard : t -> InferIR.HilExp.t -> t

Release the lock the guard was constructed with.

type summary = t
val pp_summary : F.formatter -> summary -> unit
val integrate_summary : InferIR.Tenv.t -> t -> InferIR.Typ.Procname.t -> InferBase.Location.t -> summary -> t