Module Mval.MakeLattice

Make mvalue Lattice from offset lattice.

Parameters

Signature

include Mval_intf.Printable with type idx = Offs.idx
type idx = Offs.idx

Type of indices in mvalue offset.

type t = GoblintCil.varinfo * idx Offset.t
include Printable.S with type t := t
val is_definite : t -> bool

Whether offset of mvalue has only definite integer indexing (and fields).

val add_offset : t -> idx Offset.t -> t

add_offset m o appends o to m.

val prefix : t -> t -> idx Offset.t option

prefix m1 m2 checks if m1 is a prefix of m2.

  • returns

    Some o if it is (such that the variables are equal and add_offset m1 o = m2), None if it is not.

val to_cil : t -> GoblintCil.lval

Convert to CIL lvalue.

val to_cil_exp : t -> GoblintCil.exp

Convert to CIL lvalue expression.

val type_of : t -> GoblintCil.typ

Type of mvalue.

include Lattice.S with type t := t
include Lattice.PO with type t := t
include Printable.S with type t := 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
val top_indices : t -> t

Change all indices to top indices.

val semantic_equal : t -> t -> bool option

Check semantic equality of two mvalues.

  • returns

    Some true if definitely equal, Some false if definitely not equal, None if unknown.