AddressDomain.AddressLatticeAddress 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.Latticeinclude sig ... endtype t = AddressBase(Mval).t = | Addr of Mval.tPointer to mvalue.
*)| NullPtrNULL pointer.
*)| UnknownPtrUnknown pointer. Could point to globals, heap and escaped variables.
*)| StrPtr of StringDomain.tString literal pointer. StrPtr None abstracts any string pointer
val to_n_c_string : int -> t -> string optionConvert StrPtr to C string of given maximum length if possible.
val to_string_length : t -> int optionFind length of C string if possible.
val is_definite : t -> boolWhether address is a NULL pointer or an mvalue that has only definite integer indexing (and fields).
val of_var : GoblintCil.varinfo -> tConvert from variable (without offset).
val to_var : t -> GoblintCil.varinfo optionConvert to variable if possible.
val to_var_may : t -> GoblintCil.varinfo optionConvert to variable with any offset if possible.
val to_var_must : t -> GoblintCil.varinfo optionConvert to variable without offset if possible.
val to_exp : t -> GoblintCil.expConvert to CIL expression.
val type_of : t -> GoblintCil.typType of address.
include 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).