#parser #WebAssembly #wasm

wasmparser

A simple event-driven library for parsing WebAssembly binary files

71 releases (29 breaking)

new 0.30.0 Apr 18, 2019
0.29.2 Feb 22, 2019
0.28.0 Feb 1, 2019
0.23.0 Dec 12, 2018
0.7.2 Jul 7, 2017

#5 in WebAssembly

Download history 299/week @ 2019-01-04 306/week @ 2019-01-11 848/week @ 2019-01-18 876/week @ 2019-01-25 1092/week @ 2019-02-01 1410/week @ 2019-02-08 1650/week @ 2019-02-15 1848/week @ 2019-02-22 2042/week @ 2019-03-01 1862/week @ 2019-03-08 1499/week @ 2019-03-15 1830/week @ 2019-03-22 1637/week @ 2019-03-29 1680/week @ 2019-04-05 2332/week @ 2019-04-12

6,785 downloads per month
Used in 21 crates (7 directly)

Apache-2.0 WITH LLVM-exception

322KB
7.5K SLoC

The WebAssembly binary file decoder in Rust

Build Status crates.io link

The decoder library provides lightwight and fast decoding/parsing of WebAssembly binary files.

The other goal is minimal memory footprint. For this reason, there is no AST or IR of WebAssembly data.

See also its sibling at https://github.com/wasdk/wasmparser

Documentation

The documentation and examples can be found at the https://docs.rs/wasmparser/

Example

use wasmparser::WasmDecoder;
use wasmparser::Parser;
use wasmparser::ParserState;

fn get_name(bytes: &[u8]) -> &str {
  str::from_utf8(bytes).ok().unwrap()
}

fn main() {
  let ref buf: Vec<u8> = read_wasm_bytes();
  let mut parser = Parser::new(buf);
  loop {
    let state = parser.read();
    match *state {
        ParserState::BeginWasm { .. } => {
            println!("====== Module");
        }
        ParserState::ExportSectionEntry { field, ref kind, .. } => {
            println!("  Export {} {:?}", get_name(field), kind);
        }
        ParserState::ImportSectionEntry { module, field, .. } => {
            println!("  Import {}::{}", get_name(module), get_name(field))
        }
        ParserState::EndWasm => break,
        _ => ( /* println!(" Other {:?}", state) */ )
    }
  }
}

Fuzzing

To fuzz test wasmparser.rs, switch to a nightly Rust compiler and install cargo-fuzz:

cargo install cargo-fuzz

Then, from the root of the repository, run:

cargo fuzz run parse

If you want to use files as seeds for the fuzzer, add them to fuzz/corpus/parse/ and restart cargo-fuzz.

Dependencies