ValueDomain.CArraysinclude ArrayDomain.Str with type idx = ArrIdxDomain.tinclude ArrayDomain.S0 with type idx = ArrIdxDomain.tinclude Lattice.Sinclude Lattice.POinclude Printable.Sinclude Lattice.Bot with type t := tinclude Lattice.Top with type t := ttype idx = ArrIdxDomain.tThe abstract domain used to index on arrays.
val to_null_byte_domain : string -> tstring_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 ArrayDomain.S
  with type t := t
   and type idx := idx
  with type value = Compound.tinclude ArrayDomain.S0
  with type t := t
  with type idx := idx
  with type value = Compound.tinclude Lattice.S with type t := tinclude Lattice.PO with type t := twiden x y assumes leq x y. Solvers guarantee this by calling widen old (join old new).
type value = Compound.tThe abstract domain of values stored in the array.
val set : 
  ArrayDomain.VDQ.t ->
  t ->
  (Basetype.CilExp.t option * idx) ->
  value ->
  tReturns 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 ->
  tmake l e creates an abstract representation of an array of length l * containing the element e.
val move_if_affected : 
  ?replace_with_const:bool ->
  ArrayDomain.VDQ.t ->
  t ->
  GoblintCil.Cil.varinfo ->
  (GoblintCil.Cil.exp -> int option) ->
  tchanges 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 listreturns 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 ->
  tval smart_widen : 
  (GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
  (GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
  t ->
  t ->
  tval smart_leq : 
  (GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
  (GoblintCil.Cil.exp -> IntOps.BigIntOps.t option) ->
  t ->
  t ->
  boolval project : 
  ?varAttr:GoblintCil.Cil.attributes ->
  ?typAttr:GoblintCil.Cil.attributes ->
  ArrayDomain.VDQ.t ->
  t ->
  tval invariant : 
  value_invariant:
    (offset:GoblintCil.Cil.offset ->
      lval:GoblintCil.Cil.lval ->
      value ->
      Invariant.t) ->
  offset:GoblintCil.Cil.offset ->
  lval:GoblintCil.Cil.lval ->
  t ->
  Invariant.tval domain_of_t : t -> ArrayDomain.domainval get : 
  ?checkBounds:bool ->
  ArrayDomain.VDQ.t ->
  t ->
  (Basetype.CilExp.t option * idx) ->
  valueReturns the element residing at the given index.