BufferOverrunDomain.Memtype 'has_oenv t0 = | UnreachableMemory of unreachable node
*)| ExcRaisedMemory of node that can be reachable only with exception raises that we want to ignore
*)| Reachable of 'has_oenv MemReach.t0type no_oenv_t = IStdlib.GOption.none t0Memory type without an environment for on-demand symbol evaluation
type t = IStdlib.GOption.some t0Memory type with an environment for on-demand symbol evaluation
include Absint.AbstractDomain.S with type t := tinclude Absint.AbstractDomain.Comparable with type t := tinclude IStdlib.PrettyPrintable.PrintableType with type t := tval pp : Stdlib.Format.formatter -> _ t0 -> unitval unreachable : tval is_reachable : t -> booltype get_summary = IR.Procname.t -> no_oenv_t optionval init : get_summary -> BufferOverrunOndemandEnv.t -> tval exc_raised : tval is_rep_multi_loc : AbsLoc.Loc.t -> _ t0 -> boolCheck if an abstract location represents multiple concrete locations.
val is_stack_loc : AbsLoc.Loc.t -> _ t0 -> boolCheck if an abstract location is a stack variable, e.g., n$0.
val set_prune_pairs : PrunePairs.t -> t -> tval set_latest_prune : LatestPrune.t -> t -> tval set_first_idx_of_null : AbsLoc.Loc.t -> Val.t -> t -> tIn C string, set the index of the first null character, i.e., end of string, when called by set_first_idx_of_null loc_to_string index_value mem.
val unset_first_idx_of_null : AbsLoc.Loc.t -> Val.t -> t -> tIn C string, unset the index of the first null character, i.e., end of string, when called by unset_first_idx_of_null loc_to_string index_value mem. This is unsound because the index can be assigned as previous index + 1 that is a heuristic to keep string lengths in some loops.
val get_c_strlen : AbsLoc.PowLoc.t -> _ t0 -> Val.tGet C string length that is set/unset by set_first_idex_of_null and unset_first_idex_of_null
val get_latest_prune : _ t0 -> LatestPrune.tval get_reachable_locs_from :
(IR.Pvar.t * IR.Typ.t) list ->
AbsLoc.LocSet.t ->
_ t0 ->
AbsLoc.LocSet.tGet reachable locations from formals and locs when called get_reachable_locs_from formals locs mem
val add_stack :
?represents_multiple_values:bool ->
AbsLoc.Loc.t ->
Val.t ->
t ->
tAdd an abstract value for stack variables such as n$0
val add_stack_loc : AbsLoc.Loc.t -> t -> tval add_heap :
?represents_multiple_values:bool ->
AbsLoc.Loc.t ->
Val.t ->
t ->
tAdd an abstract value for non-stack variables
val add_heap_set :
?represents_multiple_values:bool ->
AbsLoc.PowLoc.t ->
Val.t ->
t ->
tval add_unknown :
(IR.Ident.t * IR.Typ.t) ->
location:IBase.Location.t ->
t ->
tAdd an unknown value for stack variables
val add_unknown_from :
(IR.Ident.t * IR.Typ.t) ->
callee_pname:IR.Procname.t ->
location:IBase.Location.t ->
t ->
tAdd an unknown return value of callee_pname for stack variables
Remove temporary variables and if Config.bo_exit_frontend_gener_vars is true also frontend generated variables
val find : AbsLoc.Loc.t -> _ t0 -> Val.tval find_opt : AbsLoc.Loc.t -> _ t0 -> Val.t optionval find_set : ?typ:IR.Typ.t -> AbsLoc.PowLoc.t -> _ t0 -> Val.tval find_stack : AbsLoc.Loc.t -> _ t0 -> Val.tval find_alias_id : IR.Ident.t -> _ t0 -> AliasTargets.tFind aliases between given ident
val find_alias_loc : AbsLoc.Loc.t -> _ t0 -> AliasTargets.tFind aliases between given abstract location
val find_simple_alias : IR.Ident.t -> _ t0 -> (AbsLoc.Loc.t * IR.IntLit.t) listFind simple aliases between given ident. It returns a list of pairs of abstract locations and integer which represent aliases id == x + i.
val find_size_alias :
IR.Ident.t ->
_ t0 ->
(AliasTarget.alias_typ * AbsLoc.Loc.t * IR.IntLit.t * AbsLoc.Loc.t option)
listFind size aliases between given ident. It returns a list of four elements, alias type == or >=, location x, integer i, java temporary variable $irvar0. This represents id == $irvar0 (== or >=) x.size() + i.
val find_ret_alias :
_ t0 ->
AliasRet.t Absint.AbstractDomain.Types.bottom_liftedFind aliases bound to the return variable
val fgets_alias : IR.Ident.t -> AbsLoc.PowLoc.t -> t -> tSet fgets alias between an ident and an abstract location
val apply_latest_prune : IR.Exp.t -> t -> t * PrunePairs.tApply latest_prunes when given e : Exp.t is true. It returns pruned memory and pairs of pruned locations and values.
val load_alias : IR.Ident.t -> AbsLoc.Loc.t -> AliasTarget.t -> t -> tAdd an alias between ident and abstract location with given alias target
val load_empty_alias : IR.Ident.t -> AbsLoc.Loc.t -> t -> tAdd an empty alias between ident and abstract location, i.e., ident == loc.empty()
val load_simple_alias : IR.Ident.t -> AbsLoc.Loc.t -> t -> tAdd a simple alias between ident and abstract location, i.e., ident == loc
val load_size_alias : IR.Ident.t -> AbsLoc.Loc.t -> t -> tAdd a size alias between ident and abstract location, i.e., ident == loc.size()
val store_simple_alias : AbsLoc.Loc.t -> IR.Exp.t -> t -> tAdd a simple alias between abstract location and expression, i.e., loc == exp
val forget_size_alias : AbsLoc.PowLoc.t -> t -> tForget size aliases of given locs
val incr_size_alias : AbsLoc.PowLoc.t -> t -> tUpdate size aliases when the size of loc is increased by one. For example if there was an alias ident == loc.size() + i, this changes it to ident == loc.size() + i - 1, since loc.size() has been increased.
val incr_or_not_size_alias : AbsLoc.PowLoc.t -> t -> tUpdate size aliases when the size of loc may be increased by one. For example if there was an alias ident == loc.size() + i, this changes it to ident >= loc.size() + i - 1
val add_iterator_has_next_alias : IR.Ident.t -> IR.Exp.t -> t -> tAdd an AliasTarget.IteratorHasNext alias when ident = iterator.hasNext() is called
val add_iterator_next_object_alias :
ret_id:IR.Ident.t ->
iterator:IR.Ident.t ->
t ->
tAdd an AliasTarget.IteratorNextObject alias when ident = iterator.nextObject() is called
val incr_iterator_simple_alias_on_call :
eval_sym_trace ->
callee_exit_mem:no_oenv_t ->
t ->
tUpdate AliasTarget.IteratorSimple alias at function calls
val add_iterator_alias : IR.Ident.t -> t -> tAdd AliasTarget.IteratorSimple and AliasTarget.IteratorOffset aliases when Iteratable.iterator() is called
Update iterator offset alias when iterator.next() is called
val update_mem :
?force_strong_update:IStdlib.IStd.Bool.t ->
AbsLoc.PowLoc.t ->
Val.t ->
t ->
tAdd a map from locations to a value. If the given set of locations is a singleton set and the only element represents one concrete abstract location or force_strong_update is true, it does strong update. Otherwise, weak update.
val strong_update : AbsLoc.PowLoc.t -> Val.t -> t -> tval update_latest_prune :
updated_locs:AbsLoc.PowLoc.t ->
IR.Exp.t ->
IR.Exp.t ->
t ->
tUpdate latest prunes when store(x,1) or store(x,0) is called after assume statement
Forget unreachable locations from formals
val transform_mem : f:(Val.t -> Val.t) -> AbsLoc.PowLoc.t -> t -> tApply f to values bound to given locs
val add_cpp_iterator_cmp_alias :
IR.Ident.t ->
iter_lhs:IR.Pvar.t ->
iter_rhs:IR.Pvar.t ->
t ->
tAdd a compare alias from ret_id to iter_lhs: Pvar.t and iter_rhs: Pvar.t comparison, i.e., ret_id -> {iter_lhs != iter_rhs} where the meaning of != is determined by whether iter_rhs is coming from begin or end
val find_cpp_iterator_alias :
IR.Ident.t ->
t ->
(IR.Pvar.t * IR.Pvar.t * IR.Binop.t) optionFind the cpp iterator alias ret_id -> {iter_lhs (binop) iter_rhs}