package bap-std

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

Regular interface for BIL expressions

type t = Bil.exp
class state : object ... end

All visitors provide some information about the current position of the visitor

class 'a visitor : object ... end

expression visitor.

class 'a finder : object ... end

A visitor with a shortcut. Finder is a specialization of a visitor, that uses return as its folding argument. At any time you can stop the traversing by calling return function of the provided argument (which is by itself is a record with one field - a function accepting argument of type 'a option).

class mapper : object ... end

Exp mapper. By default performs deep identity mapping. Non-leaf methods deconstructs terms, calls corresponding methods on its parts and the constructs it back. So if you're overriding a non-leaf method, then make sure that you called the parent method if you want a normal traversal.

val fold : 'a visitor -> init:'a -> t -> 'a

fold visitor ~init exp traverse the exp tree with provided visitor. For example, the following will collect all address that are accessed with a load operation: { let collect_load_addresses = Exp.fold ~init:[] (object inherit [word list] Bil.visitor method! enter_load ~mem ~addr _ _ addrs = match addr with | Bil.Int addr -> addr :: addrs | _ -> addrs end) } See also Bil.fold and Stmt.fold

val iter : unit visitor -> t -> unit

iter visitor exp iterates over all terms of the exp using provided visitor. See also Bil.iter and Stmt.iter

val find : 'a finder -> t -> 'a option

find finder exp returns Some thing if finder finds some thing. See also Bil.find and Stmt.find

val map : mapper -> t -> t

map mapper exp maps exp tree using provided mapper. See also Bil.map

val exists : unit finder -> t -> bool

exists finder exp is true if finder finds something. See also Bil.exists and Stmt.exists

val substitute : exp -> exp -> exp -> exp

substitute pat rep x subsitutes each occurence of an expression pat in x with an expression rep

val normalize : exp -> exp

normalize ensures no-lets and normalized-memory. Inlines all let expressions, expands multibyte loads to a concatenation of one byte loads, and expand multibyte stores into chains of one byte stores.

  • since 1.3
val simpl : ?ignore:Eff.t list -> exp -> exp

simpl ~ignore:effects x iff expression x is well-typed, then returns an expression with the same semantics as x, that might smaller according to some metrics. A subexression is removed from x if it doesn't manifest any effects other than those that are specified with the ~ignore:effects parameter (defaults to an empty list).

The following code simplification are applied:

  • constant folding: if an expression can be computed statically then it is substituted with the result of computation, e.g., 1 + 2 -> 3
  • neutral element elimination: binary operations with one of the operands being known to be neutral, are subtituted with the other operand, e.g., x * 1 -> x
  • zero element propagation: binary operations applied to a zero element are substituted with the zero element, e.g., x * 0 -> 0
  • symbolic equality reduction: if both branches of a comparison are syntactically equal then the comparison is reduced to a boolean constant, e.g., a = a -> true, a < a -> false. Note, by default a read from a register is considered as a (co)effect, hence the above transformations wouldn't be applied, consider passing ~ignore:[Eff.reads] if you want such expressions to be reduced.
  • double complement reduction: an even amount of complement operations (one and two) are reduced to one complement of the same sort, e.g., ~~~1 -> ~1
  • binary to unary reduction: reduce a subtraction from zero to the unary negation, e.g., 0 - x -> -x
  • exclusive disjunction reduction: reduces an exclusive disjunction of syntactically equal expresions to zero, e.g, 42 ^ 42 -> 0. Note, by default a read from a register is considered as a (co)effect, thus xor eax eax is not reduced, consider passing ~ignore:[Eff.reads] if you want such expressions to be reduced.
  • since 1.3
val is_referenced : var -> t -> bool

is_referenced x exp true if exp contains Var x on one of its leafs. See also Bil.is_referenced and Stmt.is_referenced

val normalize_negatives : t -> t

normalize_negatives exp returns an exp where all negative additions are substituted by subtractions. See Bil.normalize_negatives for more details

val fold_consts : t -> t

fold_consts performs one step of constant evaluation. In order to perform all possible reductions one should use fixpoint function, provided later. Example: let x = Bil.var (Var.create "x" reg32_t) fixpoint fold_consts Bil.(x lxor x lxor x lxor x)

will yield 0x0:32, but without a fixpoint, the result would be just:

fold_constants Bil.(x lxor x lxor x lxor x) (0x0:32 ^ x) ^ x.

See also Bil.fold_consts

val fixpoint : (t -> t) -> t -> t

fixpoint f applies transformation f to t until it reaches a fixpoint, i.e., such point x that f x = f (f x). See also Bil.fixpoint and Stmt.fixpoint

val free_vars : t -> Var.Set.t

free_vars exp returns a set of all unbound variables, that occurs in the expression exp.

val eval : t -> Bil.value

eval x evaluate expression x to a value.

include Regular.Std.Regular.S with type t := t
val t_of_sexp : Sexplib.Sexp.t -> t
val sexp_of_t : t -> Sexplib.Sexp.t
val bin_t : t Core_kernel.Std.Bin_prot.Type_class.t
val bin_read_t : t Core_kernel.Std.Bin_prot.Read.reader
val __bin_read_t__ : (int -> t) Core_kernel.Std.Bin_prot.Read.reader
val bin_reader_t : t Core_kernel.Std.Bin_prot.Type_class.reader
val bin_size_t : t Core_kernel.Std.Bin_prot.Size.sizer
val bin_write_t : t Core_kernel.Std.Bin_prot.Write.writer
val bin_writer_t : t Core_kernel.Std.Bin_prot.Type_class.writer
val to_string : t -> string
val str : unit -> t -> string
val pps : unit -> t -> string
val ppo : Core_kernel.Std.out_channel -> t -> unit
val pp_seq : Format.formatter -> t Core_kernel.Std.Sequence.t -> unit
val pp : Format.formatter -> t -> unit
val (>=) : t -> t -> bool
val (<=) : t -> t -> bool
val (=) : t -> t -> bool
val (>) : t -> t -> bool
val (<) : t -> t -> bool
val (<>) : t -> t -> bool
val equal : t -> t -> bool
val compare : t -> t -> int
val min : t -> t -> t
val max : t -> t -> t
val ascending : t -> t -> int
val descending : t -> t -> int
val between : t -> low:t -> high:t -> bool
val clamp_exn : t -> min:t -> max:t -> t
val clamp : t -> min:t -> max:t -> t Core_kernel.Or_error.t
module Replace_polymorphic_compare : sig ... end
type comparator_witness
val validate_lbound : min:t Core_kernel.Maybe_bound.t -> t Core_kernel.Validate.check
val validate_ubound : max:t Core_kernel.Maybe_bound.t -> t Core_kernel.Validate.check
val validate_bound : min:t Core_kernel.Maybe_bound.t -> max:t Core_kernel.Maybe_bound.t -> t Core_kernel.Validate.check
val comparator : (t, comparator_witness) Core_kernel.Comparator.comparator
module Map : sig ... end
module Set : sig ... end
val hash : t -> int
val hashable : t Core_kernel.Std.Hashable.Hashtbl.Hashable.t
module Table : sig ... end
module Hash_set : sig ... end
module Hash_queue : sig ... end
type info = string * [ `Ver of string ] * string option
val version : string
val size_in_bytes : ?ver:string -> ?fmt:string -> t -> int
val of_bytes : ?ver:string -> ?fmt:string -> Regular.Std.bytes -> t
val to_bytes : ?ver:string -> ?fmt:string -> t -> Regular.Std.bytes
val blit_to_bytes : ?ver:string -> ?fmt:string -> Regular.Std.bytes -> t -> int -> unit
val of_bigstring : ?ver:string -> ?fmt:string -> Core_kernel.Std.bigstring -> t
val to_bigstring : ?ver:string -> ?fmt:string -> t -> Core_kernel.Std.bigstring
val blit_to_bigstring : ?ver:string -> ?fmt:string -> Core_kernel.Std.bigstring -> t -> int -> unit
module Io : sig ... end
module Cache : sig ... end
val add_reader : ?desc:string -> ver:string -> string -> t Regular.Std.reader -> unit
val add_writer : ?desc:string -> ver:string -> string -> t Regular.Std.writer -> unit
val available_readers : unit -> info list
val default_reader : unit -> info
val set_default_reader : ?ver:string -> string -> unit
val with_reader : ?ver:string -> string -> (unit -> 'a) -> 'a
val available_writers : unit -> info list
val default_writer : unit -> info
val set_default_writer : ?ver:string -> string -> unit
val with_writer : ?ver:string -> string -> (unit -> 'a) -> 'a
val default_printer : unit -> info option
val set_default_printer : ?ver:string -> string -> unit
val with_printer : ?ver:string -> string -> (unit -> 'a) -> 'a
val find_reader : ?ver:string -> string -> t Regular.Std.reader option
val find_writer : ?ver:string -> string -> t Regular.Std.writer option
val pp_adt : t Regular.Std.printer
OCaml

Innovation. Community. Security.