Module Pulselib.PulseAbductiveDomain
module BaseAddressAttributes = PulseBaseAddressAttributesmodule BaseDomain = PulseBaseDomainmodule BaseMemory = PulseBaseMemorymodule BaseStack = PulseBaseStack- module type BaseDomainSig = sig ... end
- signature common to the "normal" - Domain, representing the post at the current program point, and the inverted- PreDomain, representing the inferred pre-condition
- module PostDomain : BaseDomainSig
- The post abstract state at each program point, or current state. 
- module PreDomain : BaseDomainSig
- The inferred pre-condition at each program point, biabduction style. 
- type t- = private- {- post : PostDomain.t;- state at the current program point - pre : PreDomain.t;- inferred procedure pre-condition leading to the current program point - path_condition : PulseBasicInterface.PathCondition.t;- arithmetic facts true along the path (holding for both - preand- postsince abstract values are immutable)- topl : PulseTopl.state;- state at of the Topl monitor at the current program point, when Topl is enabled - skipped_calls : PulseBasicInterface.SkippedCalls.t;- metadata: procedure calls for which no summary was found - }
- pre/post on a single program path 
- val leq : lhs:t -> rhs:t -> bool
- val pp : Stdlib.Format.formatter -> t -> unit
- val mk_initial : IR.Tenv.t -> IR.Procdesc.t -> t
- val get_pre : t -> BaseDomain.t
- val get_post : t -> BaseDomain.t
- val simplify_instanceof : IR.Tenv.t -> t -> t
- module Stack : sig ... end
- stack operations like - BaseStackbut that also take care of propagating facts to the precondition
- module Memory : sig ... end
- memory operations like - BaseMemorybut that also take care of propagating facts to the precondition
- module AddressAttributes : sig ... end
- attribute operations like - BaseAddressAttributesbut that also take care of propagating facts to the precondition
- val is_local : IR.Var.t -> t -> bool
- val find_post_cell_opt : PulseBasicInterface.AbstractValue.t -> t -> BaseDomain.cell option
- val discard_unreachable : t -> t * Pulselib.PulseBasicInterface.AbstractValue.Set.t * PulseBasicInterface.AbstractValue.t list
- garbage collect unreachable addresses in the state to make it smaller and return the new state, the live addresses, and the discarded addresses that used to have attributes attached 
- val add_skipped_call : IR.Procname.t -> PulseBasicInterface.Trace.t -> t -> t
- val add_skipped_calls : PulseBasicInterface.SkippedCalls.t -> t -> t
- val set_path_condition : PulseBasicInterface.PathCondition.t -> t -> t
- type summary- = private t
- private type to make sure - summary_of_postis always called when creating summaries
- val skipped_calls_match_pattern : summary -> bool
- val summary_of_post : IR.Tenv.t -> IR.Procdesc.t -> t -> (summary, [> `PotentialInvalidAccessSummary of summary * PulseBasicInterface.AbstractValue.t * PulseBasicInterface.Trace.t ]) IStdlib.IStd.result PulseBasicInterface.SatUnsat.t
- trim the state down to just the procedure's interface (formals and globals), and simplify and normalize the state 
- val set_post_edges : PulseBasicInterface.AbstractValue.t -> BaseMemory.Edges.t -> t -> t
- directly set the edges for the given address, bypassing abduction altogether 
- val set_post_cell : (PulseBasicInterface.AbstractValue.t * PulseBasicInterface.ValueHistory.t) -> BaseDomain.cell -> IBase.Location.t -> t -> t
- directly set the edges and attributes for the given address, bypassing abduction altogether 
- val incorporate_new_eqs : PulseBasicInterface.PathCondition.new_eqs -> t -> (t, [> `PotentialInvalidAccess of t * PulseBasicInterface.AbstractValue.t * PulseBasicInterface.Trace.t ]) IStdlib.IStd.result
- Check that the new equalities discovered are compatible with the current pre and post heaps, e.g. - x = 0is not compatible with- xbeing allocated, and- x = yis not compatible with- xand- ybeing allocated separately. In those cases, the resulting path condition is- PathCondition.false_.
- val initialize : PulseBasicInterface.AbstractValue.t -> t -> t
- Remove "Uninitialized" attribute of the given address 
- val set_uninitialized : IR.Tenv.t -> [ `LocalDecl of IR.Pvar.t * PulseBasicInterface.AbstractValue.t option | `Malloc of PulseBasicInterface.AbstractValue.t ] -> IR.Typ.t -> IBase.Location.t -> t -> t
- Add "Uninitialized" attributes when a variable is declared or a memory is allocated by malloc. 
module Topl : sig ... end