ArrayDomain.AttributeConfiguredAndNullByteArrayDomain
Like FlagHelperAttributeConfiguredArrayDomain but additionally runs NullByte * in parallel if flag "ana.base.arrays.nullbytes" is set.
module Val : LatticeWithNull
module Idx : IntDomain.Z
include Str with type idx = Idx.t
include S0 with type idx = Idx.t
include Lattice.S
include Lattice.PO
include Printable.S
type idx = Idx.t
The abstract domain used to index on arrays.
val to_null_byte_domain : string -> t
string_copy dest src n
returns an abstract value representing the copy of string src
* into array dest
, taking at most n
bytes of src
if present
string_concat s1 s2 n
returns a new abstract value representing the string * concatenation of the input abstract values s1
and s2
, taking at most n
bytes of * s2
if present
substring_extraction haystack needle
returns IsNotSubstr
if the string represented by * the abstract value needle
surely isn't a substring of haystack
, IsSubstrAtIndex0
if * needle
is the empty string, else IsMaybeSubstr
include S with type t := t and type idx := idx with type value = Val.t
include S0 with type t := t with type idx := idx with type value = Val.t
include Lattice.S with type t := t
include Lattice.PO with type t := t
widen x y
assumes leq x y
. Solvers guarantee this by calling widen old (join old new)
.
val bot : unit -> t
val is_bot : t -> bool
val top : unit -> t
val is_top : t -> bool
type value = Val.t
The abstract domain of values stored in the array.
Returns a new abstract value, where the given index is replaced with the * given element.
val make :
?varAttr:GoblintCil.Cil.attributes ->
?typAttr:GoblintCil.Cil.attributes ->
idx ->
value ->
t
make l e
creates an abstract representation of an array of length l
* containing the element e
.
val move_if_affected :
?replace_with_const:bool ->
VDQ.t ->
t ->
GoblintCil.Cil.varinfo ->
(GoblintCil.Cil.exp -> int option) ->
t
changes the way in which the array is partitioned if this is necessitated by a change * to the variable *
val get_vars_in_e : t -> GoblintCil.Cil.varinfo list
returns the variables occuring in the expression according to which the * array was partitioned (if any)
Left fold (like List.fold_left) over the arrays elements
val smart_join :
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
t ->
t ->
t
val smart_widen :
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
t ->
t ->
t
val smart_leq :
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
(GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
t ->
t ->
bool
val invariant :
value_invariant:
(offset:GoblintCil.Cil.offset ->
lval:GoblintCil.Cil.lval ->
value ->
Invariant.t) ->
offset:GoblintCil.Cil.offset ->
lval:GoblintCil.Cil.lval ->
t ->
Invariant.t
val get :
?checkBounds:bool ->
VDQ.t ->
t ->
(Basetype.CilExp.t option * idx) ->
value
Returns the element residing at the given index.