Pulselib.PulseNonDisjunctiveDomain
module BaseMemory = PulseBaseMemory
module DecompilerExpr = PulseDecompilerExpr
module ExecutionDomain = PulseExecutionDomain
module PathContext = PulsePathContext
type copy_spec_t =
| Copied of {
source_typ : IR.Typ.t option;
source_opt : DecompilerExpr.source_expr option;
location : IBase.Location.t;
copied_location : (IR.Procname.t * IBase.Location.t) option;
heap : BaseMemory.t;
from : Pulselib.PulseBasicInterface.Attribute.CopyOrigin.t;
timestamp : Pulselib.PulseBasicInterface.Timestamp.t;
}
| Modified of {
source_typ : IR.Typ.t option;
source_opt : DecompilerExpr.source_expr option;
location : IBase.Location.t;
copied_location : (IR.Procname.t * IBase.Location.t) option;
from : Pulselib.PulseBasicInterface.Attribute.CopyOrigin.t;
copied_timestamp : Pulselib.PulseBasicInterface.Timestamp.t;
}
type parameter_spec_t =
| Unmodified of {
typ : IR.Typ.t;
location : IBase.Location.t;
heap : BaseMemory.t;
}
| Modified
include Absint.AbstractDomain.WithBottomTop
include Absint.AbstractDomain.S
include Absint.AbstractDomain.Comparable
include IStdlib.PrettyPrintable.PrintableType
val pp : IStdlib.PrettyPrintable.F.formatter -> t -> unit
val bottom : t
val is_bottom : t -> bool
val top : t
val is_top : t -> bool
module Summary : sig ... end
val add_var :
Pulselib.PulseBasicInterface.Attribute.CopiedInto.t ->
source_addr_opt:Pulselib.PulseBasicInterface.AbstractValue.t option ->
copy_spec_t ->
t ->
t
val add_field :
IR.Fieldname.t ->
source_addr_opt:Pulselib.PulseBasicInterface.AbstractValue.t option ->
copy_spec_t ->
t ->
t
val add_parameter : IR.Var.t -> parameter_spec_t -> t -> t
val mark_copy_as_modified :
is_modified:
(BaseMemory.t -> Pulselib.PulseBasicInterface.Timestamp.t -> bool) ->
copied_into:Pulselib.PulseBasicInterface.Attribute.CopiedInto.t ->
source_addr_opt:Pulselib.PulseBasicInterface.AbstractValue.t option ->
t ->
t
val mark_parameter_as_modified :
is_modified:
(BaseMemory.t -> Pulselib.PulseBasicInterface.Timestamp.t -> bool) ->
var:IR.Var.t ->
t ->
t
val get_copied :
ref_formals:(IR.Pvar.t * IR.Typ.t) list ->
ptr_formals:(IR.Pvar.t * IR.Typ.t) list ->
t ->
(Pulselib.PulseBasicInterface.Attribute.CopiedInto.t
* IR.Typ.t option
* DecompilerExpr.source_expr option
* IBase.Location.t
* (IR.Procname.t * IBase.Location.t) option
* Pulselib.PulseBasicInterface.Attribute.CopyOrigin.t)
list
val get_const_refable_parameters :
t ->
(IR.Var.t * IR.Typ.t * IBase.Location.t) list
val is_locked : t -> bool
val set_load :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Ident.t ->
IR.Var.t ->
t ->
t
val set_store :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Pvar.t ->
t ->
t
val get_loaded_locations : IR.Var.t -> t -> IBase.Location.t list
val set_passed_to :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Exp.t ->
(IR.Exp.t * IR.Typ.t) list ->
t ->
t
val remember_dropped_disjuncts :
(ExecutionDomain.t * PathContext.t) list ->
t ->
t
val add_specialized_direct_callee :
IR.Procname.t ->
IR.Specialization.Pulse.t ->
IBase.Location.t ->
t ->
t
val apply_summary :
callee_pname:IR.Procname.t ->
call_loc:IBase.Location.t ->
skip_transitive_accesses:bool ->
t ->
summary ->
t
bind ([astate1; astate2; ...; astateN], non_disj) f =
(astates1 \@ astate2 \@ ... \@ astatesN, non_disj1 U non_disj2 U ... U non_disjN)
with
(astates1, non_disj1) = f astate1 non_disj
(astates2, non_disj2) = f astate2 non_disj
...
(astatesN, non_disjN) = f astateN non_disj