68 个版本 (17 个重大变更)
新 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.3 | 2022 年 2 月 17 日 |
在 WebAssembly 中排名第 1469
每月下载量 1,662
用于 wasm-tools
1.5MB
35K SLoC
wasm-shrink
WebAssembly 测试用例缩小器。
关于
wasm-shrink
是 WebAssembly 的测试用例缩小器。它缩小 Wasm 文件,同时保留一个有趣的属性(例如,触发你的 Wasm 编译器的错误)。
用法
安装
$ cargo install wasm-tools
编写谓词脚本
谓词脚本告诉 wasm-shrink
一个 Wasm 文件是否“有趣”,即是否触发了你试图隔离的错误。
wasm-shrink
和谓词脚本之间的接口很简单
-
谓词脚本将其第一个也是唯一的参数作为 Wasm 文件。
-
如果 Wasm 文件是“有趣”的,谓词脚本必须以零状态码退出,否则以非零状态码退出。
谓词脚本不得依赖于当前工作目录,并且在任何给定时间只能运行一个谓词脚本进程。
以下是一个示例谓词脚本,可以用于跟踪 Wasmtime 中包含“断言失败:无效的栈映射”消息的 panic
#!/usr/bin/env bash
# Exit the script if any subcommand fails.
set -e
# The Wasm file is given as the first and only argument to the script.
WASM=$1
# Run the Wasm in Wasmtime and `grep` for our target bug's panic
# message.
wasmtime run $WASM 2>&1 | grep --quiet 'assertion failed: invalid stack map'
请注意,将 grep
的 --quiet
标志传递给它可以使它避免其通常的匹配打印行为,如果存在任何匹配则退出状态码为零,如果没有匹配则非零。这对于谓词脚本很有用。
运行
要运行 wasm-tools shrink
,请传递谓词和初始测试用例
$ wasm-tools shrink predicate.sh test-case.wasm -o shrunken.wasm
缩小的 Wasm 文件将写入此案例中的 shrunken.wasm
,但如果未提供 -o
标志,则根据初始测试用例的名称生成输出名称。
通过传递 --help
,您可以查看所有选项。
$ wasm-tools shrink --help
作为库嵌入
wasm-shrink
不仅仅是一个命令行工具,它还定义了一个库,以允许程序化使用。
首先,将依赖项添加到您的 Cargo.toml
$ cargo add wasm-shrink
然后使用 wasm_shrink::WasmShrink
构建器来配置和运行一个缩减任务
use wasm_shrink::WasmShrink;
// Get the Wasm you want to shrink from somewhere.
let my_input_wasm: Vec<u8> = todo!();
// Configure the shrinking task.
let shrink = WasmShrink::default()
// Give up on shrinking after 999 failed attempts to shrink a given
// Wasm test case any further.
.attempts(999);
// Run the configured shrinking task.
let info = shrink.run(
my_input_wasm,
// Predicate.
&mut |wasm| {
let is_interesting: bool = todo!(
"check for whether the given Wasm is interesting"
);
Ok(is_interesting)
},
// Callback called each time we find a new smallest interesting
// Wasm.
&mut |new_smallest| {
// Optionally do something with the new smallest Wasm.
Ok(())
},
)?;
// Get the shrunken Wasm and other information about the completed shrink
// task from the returned `ShrinkInfo`.
let shrunken_wasm = info.output;
有关更多详细信息,请参阅 在 docs.rs
上的文档。
依赖项
~6MB
~121K SLoC