# lucet-validate
Validates a WebAssembly module against a witx spec.
## What is witx?
* Witx is a specification languaged developed as part of the
[WASI](https://github.com/WebAssembly/WASI) effort. The `witx` crate lives in
that repository, as well as `.witx` files that describe the WASI standard.
* A Witx specification is parsed and validated from `.witx` files by the `witx`
crate. The set of types and modules defined by these files is called a Witx document.
* A Witx specification contains modules, and modules contain interface functions.
These are functions defined in terms of parameters (inputs) and results
(outputs), all of which can have complex types like pointers, arrays, strings,
structs etc.
* Each interface function has a method to calculate its type signature in terms
of the "core" WebAssembly types (i32, i64, f32, f64 used in WebAssembly 1.0
function types). This calculation takes into account that some complex types
are passed as pointers into linear memory, or a pointer-length pair, while
others (smaller ints like u8 or s16) can be represented by atomic values
(i32, in this example).
## What is validated?
* The WebAssembly module itself is validated to be WebAssembly 1.0. We don't
support validating extensions to the spec yet but ought to be able to without
any issues.
* Each import of the WebAssembly module is validated to be present, and have
the expected core type signature, given by the Witx document.
* If the Validator is set to validate an `wasi-exe`, it additionally checks
that the module exports a function named `_start` with the type signature `[]
-> ()`. (This is not to be confused with having a `start` section, which is a
different concept from the WASI executable entrypoint `_start`.)
## What is not?
* The WebAssembly module does not contain enough information to determine that
the core types found in the type signature are used by the WebAssembly
program in a way that matches the complex types (strings arrays structs etc)
in the witx document. This property could only be validated in the source
language before it is compiled to WebAssembly.