Module Make.Offset

include Memory_sig.Fixed_size_value_domain with module Context = Scalar.Context and type binary = Scalar.binary and type boolean = Scalar.boolean and module Context = Scalar.Context and module Scalar = Scalar
include Domain_sig.Minimal with module Context = Scalar.Context with type boolean = Scalar.boolean with module Context = Scalar.Context
include Domain_sig.With_Boolean with module Context := Context and type boolean := boolean
include Memory_sig.With_Fixed_Size_Value with module Context := Context and type boolean := boolean with type binary = Scalar.binary with module Scalar = Scalar
include Memory_sig.With_Address with module Context := Context with type boolean := boolean with type binary = Scalar.binary with module Scalar = Scalar
module Scalar = Scalar
type binary = Scalar.binary
val serialize : size:int -> Context.t -> binary -> Context.t -> binary -> 'a Context.in_acc -> (binary, 'a) Context.result
val bchoose : size:int -> Transfer_functions.Choice.t -> Context.t -> binary -> binary
val bindex : size:int -> int -> Context.t -> binary -> Scalar.binary -> binary
val bisub : size:int -> Context.t -> binary -> binary -> Scalar.binary
val bshift : size:int -> offset:int -> max:int option -> Context.t -> binary -> binary
val ble : size:int -> Context.t -> binary -> binary -> boolean
val beq : size:int -> Context.t -> binary -> binary -> boolean
val binary_unknown_typed : size:int -> Context.t -> Types.Ctypes.typ -> binary
val has_type : size:int -> Context.t -> Types.Ctypes.typ -> binary -> bool
val binary2scalar_binary : size:int -> Context.t -> binary -> Scalar.binary
val assume_type : size:int -> Context.t -> binary -> Types.Ctypes.typ -> unit
val global_symbol : Context.t -> string -> int * binary
val add_global_symbol : size:int -> Context.t -> string -> binary -> unit
val add_global_scalar_symbol : size:int -> Context.t -> string -> Scalar.binary -> unit
val within_bounds : size:int -> Context.t -> binary -> boolean
module Query : sig ... end
include Domain_sig.With_Binary with type boolean := boolean and type binary := binary and module Context := Context
module Binary : Datatype_sig.S with type t = binary
val binary_pretty : size:int -> Context.t -> Stdlib.Format.formatter -> binary -> unit
val serialize_binary : size:int -> Context.t -> binary -> Context.t -> binary -> 'a Context.in_acc -> (binary, 'a) Context.result
val binary_empty : size:int -> Context.t -> binary
val binary_unknown : size:int -> Context.t -> binary
include Fully_expanded_finite_region.Enumerable_offset with module Context := Context and module Scalar := Scalar and type offset = Scalar.binary and type boolean := boolean
include Memory_sig.Offset with module Context := Context with module Scalar := Scalar with type offset = Scalar.binary with type boolean := boolean
include Domain_sig.Minimal with module Context := Context with type boolean := boolean
include Domain_sig.Minimal_No_Boolean with module Context := Context with type boolean := boolean
include Domain_sig.With_Id
val unique_id : Domain_sig.Fresh_id.t
val name : string
include Domain_sig.With_Context with module Context := Context
val root_context : unit -> Context.t
val context_pretty : Stdlib.Format.formatter -> Context.t -> unit
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
include Memory_sig.With_Offset with module Context := Context and type boolean := boolean with module Scalar := Scalar with type offset = Scalar.binary
type offset = Scalar.binary
module Offset : sig ... end
val offset_pretty : size:int -> Context.t -> Stdlib.Format.formatter -> offset -> unit
val offset_empty : size:int -> Context.t -> offset
val serialize_offset : size:int -> Context.t -> offset -> Context.t -> offset -> 'a Context.in_acc -> (offset, 'a) Context.result
val offset_zero : size:int -> max:int option -> Context.t -> offset

Transfer functions *

val offset_shift : size:int -> offset:int -> max:int option -> Context.t -> offset -> offset
val offset_index : size:int -> int -> Context.t -> offset -> Scalar.binary -> offset
val offset_sub : size:int -> Context.t -> offset -> offset -> Scalar.binary
val offset_le : size:int -> Context.t -> offset -> offset -> boolean
val offset_eq : size:int -> Context.t -> offset -> offset -> boolean
val offset_within_bounds : size:int -> Context.t -> offset -> boolean
val offset_choose : size:int -> Transfer_functions.Choice.t -> Context.t -> offset -> offset
val boolean2scalar_bool : Context.t -> boolean -> Scalar.boolean
val scalar_bool2boolean : Context.t -> Scalar.boolean -> boolean
val fold_crop : size:int -> Context.t -> offset -> inf:Z.t -> sup:Z.t -> (Z.t -> 'a -> 'a) -> 'a -> 'a
val is_precise : size:int -> Context.t -> offset -> Z.t Memory_sig.precision
val in_bounds : size:int -> Context.t -> offset -> inf:Z.t -> sup:Z.t -> bool