wain-validate 0.1.5

WebAssembly syntax tree validator for wain project
Documentation
wain-validate
=============
[![crates.io][crates-io-badge]][crates-io]
[![CI][ci-badge]][ci]

[`wain-validate`][gh] is a crate to validate a parsed WebAssembly abstract syntax tree.
Validation logic is defined in [spec][wasm-spec-validation]

This crate is part of larger [wain][proj] project.


## Installation

```toml
[dependencies]
wain-validate = "0"
```


## Usage

It takes a reference to `wain_ast::Root` value and validates it. The value can be generated by
`wain-syntax-binary` and `wain-syntax-text` parsers:

- [wain-ast]https://crates.io/crates/wain-ast
- [wain-syntax-text]https://crates.io/crates/wain-syntax-text
- [wain-syntax-binary]https://crates.io/crates/wain-syntax-binary

Using `wain_validate::validate()` is the easiest way.

```rust
extern crate wain_syntax_binary;
extern crate wain_validate;

use std::fs;
use wain_syntax_binary::parse;
use wain_validate::validate;

let source = fs::read("foo.wasm").unwrap();
let tree = parse(&source).unwrap();

if let Err(err) = validate(&tree) {
    eprintln!("This .wasm file is invalid!: {}", err);
}
```

Working examples can be seen at [examples/api/ directory][examples]

Please read documentation (not yet) for details.


## Implementation

Conforming [spec][wasm-spec-validation], following things are validated:

- In Wasm, every reference is an index. It validates all indices are not out of bounds
- Wasm is designed to check stack operations statically. It validates instructions sequences with
  emulating stack state
- Type check is best-effort due to polymorphic instruction `select`. Since almost all instructions
  are not polymorphic, almost all type checks can be done in validation

Conforming the spec, wain validates instructions after `unreachable` instruction. For example,

```wat
(unreachable) (i64.const 0) (i32.add)
```

`i32.add` is invalid because it should take two `i32` values from stack but at least one `i64` value
is in the stack.


## License

[the MIT license](./LICENSE.txt)

[ci-badge]: https://github.com/rhysd/wain/workflows/CI/badge.svg?branch=master&event=push
[ci]: https://github.com/rhysd/wain/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush
[crates-io-badge]: https://img.shields.io/crates/v/wain-validate.svg
[crates-io]: https://crates.io/crates/wain-validate
[wasm-spec-validation]: https://webassembly.github.io/spec/core/valid/index.html
[gh]: https://github.com/rhysd/wain/tree/master/wain-validate
[proj]: https://github.com/rhysd/wain
[examples]: https://github.com/rhysd/wain/tree/master/examples/api