Module InferModules.PulseOperations
module AbstractAddress = PulseDomain.AbstractAddresstype t= PulseAbductiveDomain.ttype 'a access_result= ('a, PulseDiagnostic.t) InferStdlib.IStd.result
module Closures : sig ... endval eval : InferBase.Location.t -> InferIR.Exp.t -> t -> (t * PulseDomain.AddrTracePair.t) access_resultUse the stack and heap to evaluate the given expression down to an abstract address representing its value.
Return an error state if it traverses some known invalid address or if the end destination is known to be invalid.
val eval_deref : InferBase.Location.t -> InferIR.Exp.t -> t -> (t * PulseDomain.AddrTracePair.t) access_resultLike
evalbut evaluates*exp.
val eval_access : InferBase.Location.t -> PulseDomain.AddrTracePair.t -> InferModules.PulseDomain.Memory.Access.t -> t -> (t * PulseDomain.AddrTracePair.t) access_resultLike
evalbut starts from an address instead of an expression, checks that it is valid, and if so dereferences it according to the access.
val havoc_id : InferIR.Ident.t -> PulseDomain.ValueHistory.t -> t -> tval havoc_deref : InferBase.Location.t -> PulseDomain.AddrTracePair.t -> PulseDomain.ValueHistory.t -> t -> t access_resultval havoc_field : InferBase.Location.t -> PulseDomain.AddrTracePair.t -> InferIR.Typ.Fieldname.t -> PulseDomain.ValueHistory.t -> t -> t access_resultval realloc_var : InferIR.Var.t -> InferBase.Location.t -> t -> tval write_id : InferIR.Ident.t -> PulseDomain.Stack.value -> t -> tval write_deref : InferBase.Location.t -> ref:PulseDomain.AddrTracePair.t -> obj:PulseDomain.AddrTracePair.t -> t -> t access_resultwrite the edge
ref --*--> obj
val invalidate : InferBase.Location.t -> PulseDomain.Invalidation.t PulseDomain.InterprocAction.t -> PulseDomain.AddrTracePair.t -> t -> t access_resultrecord that the address is invalid
val invalidate_deref : InferBase.Location.t -> PulseDomain.Invalidation.t PulseDomain.InterprocAction.t -> PulseDomain.AddrTracePair.t -> t -> t access_resultrecord that what the address points to is invalid
val invalidate_array_elements : InferBase.Location.t -> PulseDomain.Invalidation.t PulseDomain.InterprocAction.t -> PulseDomain.AddrTracePair.t -> t -> t access_resultrecord that all the array elements that address points to is invalid
val shallow_copy : InferBase.Location.t -> PulseDomain.AddrTracePair.t -> t -> (t * AbstractAddress.t) access_resultreturns the address of a new cell with the same edges as the original
val remove_vars : InferIR.Var.t list -> InferBase.Location.t -> t -> tval check_address_escape : InferBase.Location.t -> InferIR.Procdesc.t -> AbstractAddress.t -> PulseDomain.ValueHistory.t -> t -> t access_resultval call : caller_summary:Summary.t -> InferBase.Location.t -> InferIR.Typ.Procname.t -> ret:(InferIR.Ident.t * InferIR.Typ.t) -> actuals:((AbstractAddress.t * PulseDomain.ValueHistory.t) * InferIR.Typ.t) list -> t -> t list access_resultperform an interprocedural call: apply the summary for the call proc name passed as argument if it exists