The BAP Microexecution Framework
Parameter #1 Bap_primus . Std . Primus . Machine . Main . M
type 'a t

the machine computation

type 'a m

an external monad in which the machine computation is wrapped

module Observation : sig ... end

Observations interface.

module Syntax : sig ... end

Computation Syntax.

include Monads.Std.Monad.State.Multi.S with type 'a t := 'a t and type 'a m := 'a m and type env := Bap.Std.project and type id := id and module Syntax := Syntax and type 'a e = ?boot:unit t -> ?init:unit t -> ?fini:unit t -> (exit_status * Bap.Std.project) m effect
include Monads.Std.Monad.Trans.S with type 'a t := 'a t with type 'a m := 'a m with type 'a e = ?boot:unit t -> ?init:unit t -> ?fini:unit t -> (exit_status * Bap.Std.project) m effect
type 'a e = ?boot:unit t -> ?init:unit t -> ?fini:unit t -> (exit_status * Bap.Std.project) m effect
module Id : Core_kernel.Identifiable.S with type t = id
val global : id

the identifier of the global (initial) state.

val fork : unit -> unit t

fork () forks the current state.

val switch : id -> unit t

switch id switches to the state with the given id if such state is alive, otherwise switches to the closest alive ancestor of the state with the given id

val parent : unit -> id t

parent () returns an identifier of the closest alive parent.

val ancestor : id list -> id t

ancestor ids returns an identifier of the closest common ancestor of states with the given identifiers.

val current : unit -> id t

current id returns an identifier of current state.

val kill : id -> unit t

kill id kills a state with the specified id. If id corresponds to the current state, then switches to the closest ancestor. If id = global then do nothing.

val forks : unit -> id Core_kernel.Sequence.t t

forks xs returns a sequence of all alive states

status id returns a status of a state with the given id

include Monads.Std.Monad.State.S with type 'a t := 'a t and type 'a e := 'a e and type 'a m := 'a m with type env := Bap.Std.project with module Syntax := Syntax
include Monads.Std.Monad.Trans.S with type 'a t := 'a t with type 'a e := 'a e with type 'a m := 'a m
val lift : 'a m -> 'a t

lifts inner monad into the resulting monad

val run : 'a t -> 'a e

runs the computation

include Monads.Std.Monad.Monad with type 'a t := 'a t with module Syntax := Syntax
val void : 'a t -> unit t

void m computes m and discrards the result.

val sequence : unit t list -> unit t

sequence xs computes a sequence of computations xs in the left to right order.

val forever : 'a t -> 'b t

forever xs creates a computationt that never returns.

module Fn : sig ... end

Various function combinators lifted into the Kleisli category.

module Pair : sig ... end

The pair interface lifted into the monad.

module Triple : sig ... end

The triple interface lifted into a monad.

module Lift : sig ... end

Lifts functions into the monad.

module Exn : sig ... end

Interacting between monads and language exceptions

module Collection : sig ... end

Lifts collection interface into the monad.

module List : Collection.S with type 'a t := 'a list

The Monad.Collection.S interface for lists

module Seq : Collection.S with type 'a t := 'a Core_kernel.Sequence.t

The Monad.Collection.S interface for sequences

include Monads.Std.Monad.Syntax.S with type 'a t := 'a t
val (>>=) : 'a t -> ( 'a -> 'b t ) -> 'b t

m >>= f is bind m f

val (>>|) : 'a t -> ( 'a -> 'b ) -> 'b t

m >>= f is map m ~f

val (>=>) : ( 'a -> 'b t ) -> ( 'b -> 'c t ) -> 'a -> 'c t

f >=> g is fun x -> f x >>= g

val (!!) : 'a -> 'a t

!!x is return x

val (!$) : ( 'a -> 'b ) -> 'a t -> 'b t

!$f is Lift.unary f

val (!$$) : ( 'a -> 'b -> 'c ) -> 'a t -> 'b t -> 'c t

!$$f is Lift.binary f

val (!$$$) : ( 'a -> 'b -> 'c -> 'd ) -> 'a t -> 'b t -> 'c t -> 'd t

!$$$f is Lift.ternary f

val (!$$$$) : ( 'a -> 'b -> 'c -> 'd -> 'e ) -> 'a t -> 'b t -> 'c t -> 'd t -> 'e t

!$$$$f is Lift.quaternary f

val (!$$$$$) : ( 'a -> 'b -> 'c -> 'd -> 'e -> 'f ) -> 'a t -> 'b t -> 'c t -> 'd t -> 'e t -> 'f t

!$$$$$f is Lift.quinary f

include Core_kernel.Monad.S with type 'a t := 'a t
val (>>=) : 'a t -> ( 'a -> 'b t ) -> 'b t

t >>= f returns a computation that sequences the computations represented by two monad elements. The resulting computation first does t to yield a value v, and then runs the computation returned by f v.

val (>>|) : 'a t -> ( 'a -> 'b ) -> 'b t

t >>| f is t >>= (fun a -> return (f a)).

module Monad_infix : sig ... end
val bind : 'a t -> f:( 'a -> 'b t ) -> 'b t

bind t ~f = t >>= f

val return : 'a -> 'a t

return v returns the (trivial) computation that returns v.

val map : 'a t -> f:( 'a -> 'b ) -> 'b t

map t ~f is t >>| f.

val join : 'a t t -> 'a t

join t is t >>= (fun t' -> t').

val ignore_m : 'a t -> unit t

ignore_m t is map t ~f:(fun _ -> ()). ignore_m used to be called ignore, but we decided that was a bad name, because it shadowed the widely used Caml.ignore. Some monads still do let ignore = ignore_m for historical reasons.

val all : 'a t list -> 'a list t
val all_unit : unit t list -> unit t

Like all, but ensures that every monadic value in the list produces a unit value, all of which are discarded rather than being collected into a list.

val all_ignore : unit t list -> unit t
module Let_syntax : sig ... end

These are convenient to have in scope when programming with a monad:

val put : Bap.Std.project -> unit t

put s changes the current state to s

val get : unit -> Bap.Std.project t

get s gets the current state

val gets : ( Bap.Std.project -> 'r ) -> 'r t

gets p projects the current state with the function p

val update : ( Bap.Std.project -> Bap.Std.project ) -> unit t

update f updates the current state with the function f

module Local : State with type 'a m := 'a t and type 'a t := 'a state

Local state of the machine.

module Global : State with type 'a m := 'a t and type 'a t := 'a state

Global state shared across all machine clones.

val raise : exn -> 'a t

raise exn raises the machine exception exn, intiating an abonormal control flow

val catch : 'a t -> ( exn -> 'a t ) -> 'a t

catch x f creates a computation that is equal to x if it terminates normally, and to f e if x terminates abnormally with the exception e.

val project : Bap.Std.project t

project is a computation that results with the project data structure. Note, that Machine is a State monad with the env type equal to project, thus project is a shortcut to get ().

This function is always evaluated in the global context, i.e., there is only one project that is shared by all machine forks.

You can use put project to update the project data structure.

program program representation.

The same as gets Project.program.

val arch : Bap.Std.arch t

arch code architecture.

The same as gets Project.arch.

val args : string array t

args program command line arguments.

val envp : string array t

envp program environment variables.