99个版本 (32个重大变化)

0.216.0 2024年8月22日
0.215.0 2024年7月31日
0.214.0 2024年7月16日
0.202.0 2024年3月26日
0.1.11 2020年11月23日

#9WebAssembly

Download history 9986/week @ 2024-05-02 10263/week @ 2024-05-09 15322/week @ 2024-05-16 11009/week @ 2024-05-23 15877/week @ 2024-05-30 14017/week @ 2024-06-06 17001/week @ 2024-06-13 15557/week @ 2024-06-20 15489/week @ 2024-06-27 12173/week @ 2024-07-04 14897/week @ 2024-07-11 16660/week @ 2024-07-18 19274/week @ 2024-07-25 16992/week @ 2024-08-01 19009/week @ 2024-08-08 16817/week @ 2024-08-15

每月75,149次下载
4 crates 中使用

Apache-2.0…

1MB
29K SLoC

wasm-smith

WebAssembly测试用例生成器。

功能

  • 始终有效:所有生成的Wasm模块都通过验证。wasm-smith可以绕过你的wasm解析器和验证器,测试你的Wasm编译器、运行时或工具的核心。

  • 支持完整的WebAssembly语言:没有盲点或未实现的指令。

  • 实现了Arbitrary特质:易于与cargo fuzzlibfuzzer-sys一起使用!

  • 确定性:给定相同的输入种子,总是生成相同的输出Wasm模块,因此您可以始终重现测试失败。

  • 与基于变异的模糊测试器兼容:输入的小变化往往会导致输出Wasm模块的小变化。更大的输入往往生成更大的Wasm模块。

用法

支持 cargo fuzzlibfuzzer-sys

首先,使用 cargo fuzz 定义一个新的模糊目标

$ cargo fuzz add my_wasm_smith_fuzz_target

然后,将 wasm-smith 添加到您的依赖项中

$ cargo add wasm-smith

然后,定义您的模糊目标,使其接受任意的 wasm_smith::Module 作为参数,通过 to_bytes 方法将模块转换为序列化的Wasm字节,然后将它喂给您的系统

// 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...
});

最后,开始模糊测试

$ cargo fuzz run my_wasm_smith_fuzz_target

注意: 还请查看此仓库中定义的fuzz目标validate。使用wasmparser库,它将检查由wasm-smith生成的每个模块是否成功验证。

作为命令行工具

通过cargo安装CLI工具

$ cargo install wasm-tools

将一些任意输入转换为有效的Wasm模块

$ head -c 100 /dev/urandom | wasm-tools smith -o test.wasm

最后,在生成的Wasm模块上运行您的工具

$ my-wasm-tool test.wasm

依赖项

~1.2–2.5MB
~45K SLoC