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日 |
#9 在 WebAssembly
每月75,149次下载
在 4 crates 中使用
1MB
29K SLoC
wasm-smith
WebAssembly测试用例生成器。
功能
-
始终有效:所有生成的Wasm模块都通过验证。
wasm-smith
可以绕过你的wasm解析器和验证器,测试你的Wasm编译器、运行时或工具的核心。 -
支持完整的WebAssembly语言:没有盲点或未实现的指令。
-
实现了
Arbitrary
特质:易于与cargo fuzz
和libfuzzer-sys
一起使用! -
确定性:给定相同的输入种子,总是生成相同的输出Wasm模块,因此您可以始终重现测试失败。
-
与基于变异的模糊测试器兼容:输入的小变化往往会导致输出Wasm模块的小变化。更大的输入往往生成更大的Wasm模块。
用法
支持 cargo fuzz
和 libfuzzer-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