123 releases (43 breaking)

new 0.227.1 Mar 7, 2025
0.226.0 Feb 19, 2025
0.222.0 Dec 18, 2024
0.221.0 Nov 27, 2024
0.1.11 Nov 23, 2020

#9 in WebAssembly

Download history 16291/week @ 2024-11-21 16952/week @ 2024-11-28 19924/week @ 2024-12-05 18371/week @ 2024-12-12 13319/week @ 2024-12-19 8685/week @ 2024-12-26 13105/week @ 2025-01-02 22311/week @ 2025-01-09 17837/week @ 2025-01-16 19149/week @ 2025-01-23 16840/week @ 2025-01-30 17406/week @ 2025-02-06 16253/week @ 2025-02-13 19371/week @ 2025-02-20 18791/week @ 2025-02-27 20473/week @ 2025-03-06

77,694 downloads per month
Used in 5 crates

Apache-2.0…

2.5MB
52K SLoC

wasm-smith

A WebAssembly test case generator.

Features

  • 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.

Usage

With 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::Modules 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 the wasmparser crate, it checks that every module generated by wasm-smith validates successfully.

As a Command Line Tool

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

Dependencies

~1.3–2.6MB
~47K SLoC