AddressDomain.AddressLattice
Address lattice.
Actually a disjoint union of lattices without top or bottom. Addresses are grouped as follows:
Addr
, modulo precise index expressions in the offset, is a sublattice with ordering induced by Mval
.NullPtr
is a singleton sublattice.UnknownPtr
is a singleton sublattice.ana.base.strings.domain
is disjoint, then each StrPtr
is a singleton sublattice. Otherwise, all StrPtr
are together in one sublattice with flat ordering.module Mval : Mval.Lattice
include sig ... end
type t = AddressBase(Mval).t =
| Addr of Mval.t
Pointer to mvalue.
*)| NullPtr
NULL pointer.
*)| UnknownPtr
Unknown pointer. Could point to globals, heap and escaped variables.
*)| StrPtr of StringDomain.t
String literal pointer. StrPtr None
abstracts any string pointer
val to_n_c_string : int -> t -> string option
Convert StrPtr
to C string of given maximum length if possible.
val to_string_length : t -> int option
Find length of C string if possible.
val is_definite : t -> bool
Whether address is a NULL
pointer or an mvalue that has only definite integer indexing (and fields).
val of_var : GoblintCil.varinfo -> t
Convert from variable (without offset).
val to_var : t -> GoblintCil.varinfo option
Convert to variable if possible.
val to_var_may : t -> GoblintCil.varinfo option
Convert to variable with any offset if possible.
val to_var_must : t -> GoblintCil.varinfo option
Convert to variable without offset if possible.
val to_exp : t -> GoblintCil.exp
Convert to CIL expression.
val type_of : t -> GoblintCil.typ
Type of address.
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