Module ArrayDomain.Trivial

This functor creates a trivial single cell representation of an array. The * indexing type is taken as a parameter to satisfy the type system, it is not * used in the implementation.

Parameters

module Idx : Lattice.S

Signature

include S0 with type value = Val.t with type idx = Idx.t
include Lattice.S
include Lattice.PO
include Printable.S
type t
val equal : t -> t -> bool
val hash : t -> int
val compare : t -> t -> int
val show : t -> string
val pretty : unit -> t -> Printable.Pretty.doc
val printXml : 'a BatInnerIO.output -> t -> unit
val name : unit -> string
val to_yojson : t -> Yojson.Safe.t
val tag : t -> int

Unique ID, given by HConsed, for context identification in witness

val arbitrary : unit -> t QCheck.arbitrary
val relift : t -> t
val leq : t -> t -> bool
val join : t -> t -> t
val meet : t -> t -> t
val widen : t -> t -> t

widen x y assumes leq x y. Solvers guarantee this by calling widen old (join old new).

val narrow : t -> t -> t
val pretty_diff : unit -> (t * t) -> Lattice.Pretty.doc

If leq x y = false, then pretty_diff () (x, y) should explain why.

val bot : unit -> t
val is_bot : t -> bool
val top : unit -> t
val is_top : t -> bool
type idx = Idx.t

The abstract domain used to index on arrays.

type value = Val.t

The abstract domain of values stored in the array.

val set : VDQ.t -> t -> (Basetype.CilExp.t option * idx) -> value -> t

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 length : t -> idx option

returns length of array if known

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)

val map : (value -> value) -> t -> t

Apply a function to all elements of the array.

val fold_left : ('a -> value -> 'a) -> 'a -> t -> 'a

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 update_length : idx -> t -> t
val project : ?varAttr:GoblintCil.Cil.attributes -> ?typAttr:GoblintCil.Cil.attributes -> VDQ.t -> t -> t
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 domain_of_t : t -> domain
val get : ?checkBounds:bool -> VDQ.t -> t -> (Basetype.CilExp.t option * idx) -> value

Returns the element residing at the given index.