跳转至

归约与重放验证报告

2026-10-21 使用真实 MoonBit 工具链执行一次受控故障注入归约与重放,通过注入的输出差异验证归约流程能否保持指定配置对的分歧。

目标、输入与方法

演示入口为 modules/cli/src/examples/reduction/main.mbt,调用现有库入口。它以显式种子 7 和最多 16 个候选运行归约。初始程序来自固定归约输入,生成规则为 template-rules-v1,预算为 128 个节点、深度 6、256 次构造尝试。

环境条件 实测值
宿主 Darwin 27.0.0 arm64
Moon / moonrun 0.1.20260920,提交 914d7da
编译器与 core 0.10.14+7d59c7ec9
执行配置 native-debug、native-release、wasm-gc-debug
每次编译 / 执行超时 30000 / 2000 毫秒

从仓库根目录运行:

moon run modules/cli/src/examples/reduction --target native --deny-warn

工具链实际编译和执行候选程序。注入步骤将保存给比较器的 native-release 规范结果改为另一个同类型值,从而与 native-debug 形成指定输出分歧;原始 stdout 单独保留。归约会话固定此配置对。每个候选、独立确认与源码重放都会重新执行程序并取得相应注入证据。其他配置对的差异、编译拒绝或超时不能替代目标差异。

预期与实测结果

指标 实测结果
语言模型节点 128 → 1;移除 127 个,约 99.2%
整数常量绝对值之和 21474836510 → 0
源码 UTF-8 字节数 1193 → 29
提交 / 接受候选 2 / 2;候选上限 16
搜索停止 当前候选枚举完成
独立确认 新执行保持指定配置对的分歧
确认源码重放 另一次新执行再次观察到目标分歧
搜索与独立确认耗时 3419 毫秒,Host 单调时钟

本流程预期候选继续满足指定的目标差异;实测接受 2 个候选,独立确认和重放均再次满足该条件。归约结果源码为:

fn main {
  println(false)
}

3419 毫秒包括候选搜索、独立确认及相应存证,不含原始执行、归约摘要保存或后续重放。该值是一次受工具链、系统负载与文件缓存影响的观测,不用于算法性能比较。

结论与边界

这次演示中,归约、独立确认和源码重放都保持了注入的配置对输出差异;搜索仅遍历所述候选,未验证全局最小性。真实工具链历史案例见历史回归报告;案例与尝试的保存格式及重放行为见CLI 差分执行与存证说明。

真实构建异常的产品演示

0.0.1 的发行准备使用种子 1272 和默认 16 个候选,执行当前产品的真实构建异常归约。 五配置为 native debug、native release、wasm-gc debug、wasm debug 和 js debug;没有注入输出。 在被测编译器与 core 0.10.18+6c83a7f62 下,macOS arm64 上仍观察到 native release 构造器未声明诊断。其余四配置正常输出一致,原始比较保持 Incomplete,退出码为 3。

moonsmith run --set seed_start=1272 --set sample_count=1 \
  --set 'execution.configurations=["native-debug","native-release","wasm-gc-debug","wasm-debug","js-debug"]'
项目 产品自动归约结果
节点 128 → 117
源码 UTF-8 字节数 1273 → 1147
提交 / 接受候选 16 / 2
停止原因 候选预算耗尽
独立确认 重新执行最佳源码,保持相同构建异常及有效控制结果

发布准备还分别用新工具链和固定旧版 0.10.14+7d59c7ec9 执行三例,材料按编译器分开保存。 最新构建身份、逐候选观察、独立确认和重放结果以平台证据包为准。 归约摘要中的确认尝试目录可以直接传给 moonsmith replay;重放追加执行,不再归约。

189 字节同模式小复现来自人工整理, 并非上述 16 个候选的产品自动归约结果。该调查的 236 个结构化候选、进一步人工修改和阶段实验 保留在历史材料中;它们与本次产品默认预算的结果分别报告。