Crates.io | wasm-smith |
lib.rs | wasm-smith |
version | |
source | src |
created_at | 2020-08-22 20:14:13.871061 |
updated_at | 2024-12-02 22:48:34.47113 |
description | A WebAssembly test case generator |
homepage | |
repository | https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-smith |
max_upload_size | |
id | 279604 |
Cargo.toml error: | TOML parse error at line 20, column 1 | 20 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include` |
size | 0 |
wasm-smith
A WebAssembly test case generator.
Always valid: All generated Wasm modules pass validation. wasm-smith
gets past your wasm parser and validator, exercising the guts of your Wasm
compiler, runtime, or tool.
Supports the full WebAssembly language: Doesn't have blind spots or unimplemented instructions.
Implements the
Arbitrary
trait: Easy to use with cargo fuzz
and
libfuzzer-sys
!
Deterministic: Given the same input seed, always generates the same output Wasm module, so you can always reproduce test failures.
Plays nice with mutation-based fuzzers: Small changes to the input tend to produce small changes to the output Wasm module. Larger inputs tend to generate larger Wasm modules.
cargo fuzz
and libfuzzer-sys
First, use cargo fuzz
to define a new fuzz target:
$ cargo fuzz add my_wasm_smith_fuzz_target
Next, add wasm-smith
to your dependencies:
$ cargo add wasm-smith
Then, define your fuzz target so that it takes arbitrary wasm_smith::Module
s
as an argument, convert the module into serialized Wasm bytes via the to_bytes
method, and then feed it into your system:
// fuzz/fuzz_targets/my_wasm_smith_fuzz_target.rs
#![no_main]
use libfuzzer_sys::fuzz_target;
use wasm_smith::Module;
fuzz_target!(|module: Module| {
let wasm_bytes = module.to_bytes();
// Your code here...
});
Finally, start fuzzing:
$ cargo fuzz run my_wasm_smith_fuzz_target
Note: Also check out the
validate
fuzz target defined in this repository. Using thewasmparser
crate, it checks that every module generated bywasm-smith
validates successfully.
Install the CLI tool via cargo
:
$ cargo install wasm-tools
Convert some arbitrary input into a valid Wasm module:
$ head -c 100 /dev/urandom | wasm-tools smith -o test.wasm
Finally, run your tool on the generated Wasm module:
$ my-wasm-tool test.wasm