The Smallfoot Intermediate Language: Expressions
This records information about a sizeof(typ)
expression.
nbytes
represents the result of the evaluation of sizeof(typ)
if it is statically known.
If typ
is of the form Tarray elt (Some static_length)
, then dynamic_length
is the number
of elements of type elt
in the array. The dynamic_length
, tracked by symbolic execution, may
differ from the static_length
obtained from the type definition, e.g. when an array is
over-allocated.
If typ
is a struct type, the dynamic_length
is that of the final extensible array, if any.
type t
=
| Var of Ident.t | (** Pure variable: it is not an lvalue *) |
| UnOp of Unop.t * t * Typ.t option | (** Unary operator with type of the result if known *) |
| BinOp of Binop.t * t * t | (** Binary operator *) |
| Exn of t | (** Exception *) |
| Closure of closure | (** Anonymous function *) |
| Const of Const.t | (** Constants *) |
| Cast of Typ.t * t | (** Type cast *) |
| Lvar of Pvar.t | (** The address of a program variable *) |
| Lfield of t * Typ.Fieldname.t * Typ.t | (** A field offset, the type is the surrounding struct type *) |
| Lindex of t * t | (** An array index offset: |
| Sizeof of sizeof_data |
Program expressions.
include sig ... end
val compare_sizeof_data : sizeof_data ‑> sizeof_data ‑> int
val is_null_literal : t ‑> bool
val is_zero : t ‑> bool
Turn an expression representing a type into the type it represents If not a sizeof, return the default type if given, otherwise raise an exception
val get_undefined : bool ‑> t
Get an expression "undefined", the boolean indicates whether the undefined value goest into the footprint
val pointer_arith : t ‑> bool
Checks whether an expression denotes a location using pointer arithmetic.
Currently, catches array - indexing expressions such as ai
only.
val gen_free_vars : t ‑> (unit, Ident.t) InferStdlib.IStd.Sequence.Generator.t
val program_vars : t ‑> Pvar.t InferStdlib.IStd.Sequence.t
all the program variables appearing in the expression
val pp_printenv : InferStdlib.Pp.env ‑> (InferStdlib.Pp.env ‑> F.formatter ‑> Typ.t ‑> unit) ‑> F.formatter ‑> t ‑> unit
val to_string : t ‑> string
val is_objc_block_closure : t ‑> bool