摘要
fuzz(模糊测试)是让程序在随机合法动作下长时间运行,看会不会崩溃或违反规则。之前的长局 fuzz 找到的 4 个崩溃都来自两个机制的少见组合。于是新做了一个“覆盖引导”的 novelty 模式:每一步先用不计数的试探转移尝试最多 6 个合法动作,选能带来最少见机制标签和组合的那个。
在同样的 40 个种子上,novelty 覆盖了 812 个“标签×标签”组合,比现有 default 模式的 773 只多 5.0%,没有达到事先冻结的 20% 门槛,按标准判为没有明显优势。不过三种模式明显互补。
要回答的问题
novelty 是否比现有的 default(随机)和 family(按动作族)模式覆盖更多不同的机制组合?代价多大?
方法与设置(运行前冻结)
- 规则版本 Core451、战斗输入 v5。
- 种子 73900–73939,共 40 个未用过的种子;每局最多 20 回合、400 步。三种模式同一批种子,各一个进程。
- “机制标签”是从每次转移的结果中提取的证据键,例如某种效果被触发;“组合”是同一次转移中出现的两两标签。
- 冻结的判读:novelty 的标签×标签组合数比 default、family 中较高者多 20% 以上,判为“覆盖更广”;否则判为“没有明显优势”。只跑一次,不做显著性结论。任何崩溃都另行修复,不影响判读。
结果
| 模式 | 转移 | 标签 | 动作×标签 | 标签×标签 | 有效墙钟 | 每分钟新组合 | 崩溃 |
|---|---|---|---|---|---|---|---|
| default | 5910 | 77 | 198 | 773 | 385 秒 | 120.5 | 0 |
| family | 10488 | 75 | 233 | 737 | 673 秒 | 65.7 | 0 |
| novelty | 9842 | 82 | 265 | 812 | 989 秒 | 49.3 | 0 |
novelty 的总墙钟 2906 秒中有 1917 秒是因整机内存紧张而挂起,有效时间 989 秒。
失败与负结果
- 按冻结标准未通过:812 对 773 只多 5.0%,远低于 20%;而且 novelty 每分钟新增组合最少。
- 120 局三种模式都没有崩溃,这批种子上没有新故障可比较。
互补性
三种模式合计 1055 个组合。novelty 独有 126 个组合、44 个动作×标签和 5 个标签(例如“额外行动排队”“双重行动标记被驱散”);另两种模式有 243 个组合 novelty 没碰到。default 与 family 中只出现不超过 2 次的 323 个稀有组合,novelty 覆盖了 118 个。novelty 的动作明显偏向移动(3573 次),多目标法术和攻击地形物体也比随机模式多。
局限
- 只跑一次;novelty 的选择依赖之前种子累积的覆盖,单凭种子不能复现。
- 覆盖只说明证据键出现过,不证明规则正确。
结论与下一步
不用 novelty 取代现有模式,作为补充专门触达少见机制;长跑时建议 default 与 novelty 轮换并合并覆盖统计。可能的改进(降低常见系统标签权重、按“未出现的组合”打分、把试探数从 6 降到 3)需另立实验,不改变本次结论。
Comments