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

Download history 607/week @ 2024-05-03 277/week @ 2024-05-10 639/week @ 2024-05-17 576/week @ 2024-05-24 311/week @ 2024-05-31 451/week @ 2024-06-07 607/week @ 2024-06-14 622/week @ 2024-06-21 547/week @ 2024-06-28 333/week @ 2024-07-05 521/week @ 2024-07-12 314/week @ 2024-07-19 775/week @ 2024-07-26 331/week @ 2024-08-02 234/week @ 2024-08-09 298/week @ 2024-08-16

每月下载量 1,662
用于 wasm-tools

Apache-2.0…

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