trailofbits/muton

GitHub: trailofbits/muton

专为 TON 智能合约设计的变异测试框架,通过自动注入代码变异来评估 FunC 和 Tact 合约的测试套件质量。

Stars: 4 | Forks: 0

# MuTON `muton` 是一个用于对用 FunC 和 Tact 编写的 TON 智能合约运行变异测试活动的工具。语言通过文件扩展名(`.fc`/`.func`、`.tact`)自动检测。 ## 安装说明 ### npm (推荐) ``` npm install @trailofbits/muton ``` ### 预编译二进制文件 ``` curl --proto '=https' --tlsv1.2 -LsSf https://github.com/trailofbits/muton/releases/download/v1.0.0/muton-installer.sh | sh ``` ### 从源码构建 (通过 Nix) 启用 Nix flakes 后: ``` git clone https://github.com/trailofbits/muton.git cd muton nix develop --command bash -c 'just build' # or 'direnv allow' then 'just build' muton --version ``` ### 从源码构建 (原生工具链) 需求: - Rust 工具链 (通过 rustup) - C 工具链 (gcc/clang) 和 `make` - `pkg-config` - SQLite 开发头文件 (`libsqlite3-dev`/`sqlite`) 安装通用依赖: - macOS (Homebrew): ``` # 命令行工具(如果尚未安装) xcode-select --install || true brew install rustup-init sqlite pkg-config rustup-init -y source "$HOME/.cargo/env" ``` - Ubuntu/Debian: ``` sudo apt update sudo apt install -y build-essential pkg-config libsqlite3-dev curl curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" ``` 构建并运行: ``` cargo build --release ./target/release/muton --help ``` 可选 (安装到您的 cargo bin 目录): ``` cargo install --path . --locked --force muton --version ``` ## 快速开始 - 变异单个文件 (自动检测语言): ``` muton run path/to/contract.tact ``` - 变异目录中的所有支持文件 (递归): ``` muton run path/to/project ``` - 列出某种语言可用的变异 slug: ``` muton print mutations --language tact ``` - 打印目标路径的所有变异体: ``` muton print mutants --target path/to/contract.tact ``` - 显示变异测试结果 (可按目标过滤): ``` muton print results --target path/to/contract.tact ``` - 测试所有变异体,即使更严重的变异体未被捕获 (禁用跳过优化): ``` muton run path/to/contract.tact --comprehensive ``` ## 概述 此工具旨在在进行变异测试活动时提供尽可能愉快的开发者体验,因为这类活动通常既混乱又缓慢。 Muton 在单个 `muton.sqlite` 数据库上运行,该数据库存储目标文件,并且 muton 将在给定变异被测试后或活动被 ctrl-c 中断后可靠地还原原始文件。但是,本软件仍在开发中,因此我们强烈建议在一个干净的 git 仓库中运行变异测试活动,以便您可以使用 `git reset --hard HEAD` 来恢复任何逃脱清理阶段的变异。 所有目标文件都存储在数据库中并与一系列变异相关联。每个变异关联一个或零个结果。在变异活动开始时,将保存所有目标并生成所有变异。这通常发生得很快,在几秒钟内。 然后,真正的工作开始了:muton 将遍历目标文件列表,用变异版本替换它。对于每个变异版本,它将运行测试命令并保存结果。如果变异活动中断,它将从中断处继续(除非目标文件发生更改,在这种情况下它将重新开始)。 这可能需要很长时间。假设测试运行需要 1 分钟,有 10 个文件,并且为每个文件生成了 100 个变异体,运行时间 (*假设 muton 零开销*) 将是 1 * 10 * 100 = 1000 分钟或 16 小时。 出于这个原因,仅仅让 `muton` 运行得快不足以进行快速的变异测试活动。相反,一些功能使这个过程不那么痛苦: - 默认恢复:如果活动因某种原因中途被中断,我们不需要从头开始重新启动 - 可定制目标:您可以给 muton 一个目录作为其 `target`,它将变异该目录中的所有支持文件,这可能会花费很长时间。或者,您可以给它一个文件,它只会变异该文件。 - 当更严重的变异体未被捕获时跳过较不严重的变异体:如果将表达式替换为 `throw` 语句未被测试套件捕获,这表明该表达式从未被测试套件运行。因此,可以安全地假设该行的任何其他变异也不会被测试套件捕获,因此后续变异将被跳过。这可以显着减少针对测试不足代码的运行时间。然而,这也意味着在测试套件改进后,运行时间会增加,因为变异活动开始比以前更深入地测试部分代码。 提示:向 `muton run` 传递 `--comprehensive` 以禁用此优化,并测试所有变异体,即使同一行上更严重的变异体未被捕获。 尽管有这些功能,但变异测试活动最好不频繁地进行,例如在对测试套件进行全面检修之后,而不是在添加每个单独测试之后。因此,变异测试不适合在每次推送后在 CI 中运行。您可能希望在一天结束时运行活动,以便它可以通宵运行。 ## 配置和优先级 配置源(从最高到最低优先级): 1. CLI 标志 2. 环境变量 3. 从当前工作目录向上遍历找到的最近的 `muton.toml` 4. 内置默认值 注意: - CLI 默认值被视为内置默认值(最低);只有显式提供的标志才会覆盖。 - 变异 slug 白名单在最高优先级的非空源处覆盖;不合并。 - 忽略目标在各源之间累加合并。 配置文件发现:从 `cwd` 开始,在该目录中搜索 `muton.toml`,然后是其父目录,依此类推,在第一个匹配处停止。 示例配置: ``` [log] level = "info" # one of: trace, debug, info, warn, error color = true # optional boolean; omit for auto [general] db = "muton.sqlite" ignore_targets = ["build/", "node_modules/"] # substring matches, not globs [mutations] slugs = ["ER", "CR"] # global whitelist; overrides other sources if set/non-empty [test] cmd = "npx blueprint test" timeout = 120 ``` 环境变量: - `MUTON_LOG_LEVEL`、`MUTON_LOG_COLOR` ("on"/"off") - `MUTON_DB` - `MUTON_IGNORE_TARGETS` (CSV) - `MUTON_SLUGS` (CSV;最高非空源优先) - `MUTON_TEST_CMD`、`MUTON_TEST_TIMEOUT` CLI: - `--ignore` (CSV):逗号分隔的子字符串;任何包含其中任一子字符串的目标路径都将被忽略。 - 匹配是基于子字符串的,而不是基于 glob 的。示例:`--ignore lib` 排除任何包含 "lib" 的路径。要更具体,请使用 `lib/`。 ## 示例 此仓库包含您可以尝试的示例合约: - FunC: `tests/examples/func/hello-world.fc` - Tact: `tests/examples/tact/hello-world.tact`、`tests/examples/tact/complex-contract.tact`、`tests/examples/tact/type-features.tact` ## 注意事项 - 支持混合语言项目。当以目录为目标时,仅考虑具有受支持扩展名的文件。 - 默认测试命令是 `npx blueprint test`。使用 `--test-cmd` 或通过 `MUTON_TEST_CMD` 环境变量或配置文件覆盖。
标签:FunC, NPM包, OSV-Scalibr, Rust, Tact, TON区块链, Web3安全, 单元测试增强, 变异测试, 可视化界面, 客户端加密, 智能合约安全, 暗色界面, 测试框架, 网络流量审计, 软件质量保证