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安全, 单元测试增强, 变异测试, 可视化界面, 客户端加密, 智能合约安全, 暗色界面, 测试框架, 网络流量审计, 软件质量保证