Pulselib.PulseNonDisjunctiveDomainmodule BaseMemory = PulseBaseMemorymodule DecompilerExpr = PulseDecompilerExprmodule ExecutionDomain = PulseExecutionDomainmodule PathContext = PulsePathContexttype 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;}| Modifiedinclude Absint.AbstractDomain.WithBottomTopinclude Absint.AbstractDomain.Sinclude Absint.AbstractDomain.Comparableinclude IStdlib.PrettyPrintable.PrintableTypeval pp : IStdlib.PrettyPrintable.F.formatter -> t -> unitval bottom : tval is_bottom : t -> boolval top : tval is_top : t -> boolmodule Summary : sig ... endval add_var :
Pulselib.PulseBasicInterface.Attribute.CopiedInto.t ->
source_addr_opt:Pulselib.PulseBasicInterface.AbstractValue.t option ->
copy_spec_t ->
t ->
tval add_field :
IR.Fieldname.t ->
source_addr_opt:Pulselib.PulseBasicInterface.AbstractValue.t option ->
copy_spec_t ->
t ->
tval add_parameter : IR.Var.t -> parameter_spec_t -> t -> tval 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 ->
tval mark_parameter_as_modified :
is_modified:
(BaseMemory.t -> Pulselib.PulseBasicInterface.Timestamp.t -> bool) ->
var:IR.Var.t ->
t ->
tval 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)
listval get_const_refable_parameters :
t ->
(IR.Var.t * IR.Typ.t * IBase.Location.t) listval is_locked : t -> boolval set_load :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Ident.t ->
IR.Var.t ->
t ->
tval set_store :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Pvar.t ->
t ->
tval get_loaded_locations : IR.Var.t -> t -> IBase.Location.t listval set_passed_to :
IBase.Location.t ->
Pulselib.PulseBasicInterface.Timestamp.t ->
IR.Exp.t ->
(IR.Exp.t * IR.Typ.t) list ->
t ->
tval remember_dropped_disjuncts :
(ExecutionDomain.t * PathContext.t) list ->
t ->
tval apply_summary :
callee_pname:IR.Procname.t ->
call_loc:IBase.Location.t ->
skip_transitive_accesses:bool ->
t ->
summary ->
tbind ([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