Module type Memory_sig.Value

A scalar value stored inside a memory region. Should be a subset of Domain.Minimal + With_Binary.

include Domain_sig.Minimal
include Domain_sig.Minimal_No_Boolean
include Domain_sig.With_Id
val unique_id : Domain_sig.Fresh_id.t
val name : string
include Domain_sig.With_Context
val root_context : unit -> Context.t
val context_pretty : Stdlib.Format.formatter -> Context.t -> unit
type boolean
include Domain_sig.With_Assume with module Context := Context and type boolean := boolean
val assume : Context.t -> boolean -> Context.t option

Corresponds to the creation of a new basic block, accessible only if the condition is met. None means bottom.

val imperative_assume : Context.t -> boolean -> unit

Because the transfer functions imperatively change the context, they cannot use assume, that returns a new context. Temporarily, we provide this instead (it should be applied only to fresh symbolic variables and not modify the set of valuations of the other symbolic variables. In particular, the condition must never make the context bottom).

The good long-term solution would be to make every transfer function return a new Context.t option, viewing the context as some state monad.

include Domain_sig.With_Nondet with module Context := Context
val typed_nondet2 : Context.t -> Context.t -> 'a Context.in_tuple -> Context.t * 'a Context.out_tuple
val nondet_same_context : Context.t -> 'a Context.in_tuple -> 'a Context.out_tuple
include Domain_sig.With_Fixpoint_Computation with module Context := Context
val mu_context_open : Context.t -> Context.t
val typed_fixpoint_step : init:Context.t -> arg:Context.t -> body:Context.t -> (bool * 'a Context.in_tuple) -> bool * (close:bool -> 'a Context.out_tuple * Context.t)
include Domain_sig.With_Boolean with module Context := Context and type boolean := boolean
module Boolean : Datatype_sig.S with type t = boolean
val boolean_pretty : Context.t -> Stdlib.Format.formatter -> boolean -> unit
val serialize_boolean : Context.t -> boolean -> Context.t -> boolean -> 'a Context.in_acc -> (boolean, 'a) Context.result
val boolean_empty : Context.t -> boolean
val boolean_unknown : Context.t -> boolean
val query_boolean : Context.t -> boolean -> Lattices.Quadrivalent.t
type binary
val binary_pretty : size:int -> Context.t -> Stdlib.Format.formatter -> binary -> unit
val binary_empty : size:int -> Context.t -> binary
val binary_unknown_typed : size:int -> Context.t -> Types.Ctypes.typ -> binary

Returns an unknown value with a given type.

val has_type : size:int -> Context.t -> Types.Ctypes.typ -> binary -> bool

Returns true if we can prove that x can be given type t.

val assume_type : size:int -> Context.t -> binary -> Types.Ctypes.typ -> unit
val serialize : size:int -> Context.t -> binary -> Context.t -> binary -> 'a Context.in_acc -> (binary, 'a) Context.result
module Binary_Forward : sig ... end