mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
两个变异 harness(Go 版 discover、Python 版 quota)都是「把变异写进源码 文件、跑测试、再还原」。这个形状有两个陷阱,上一轮都真踩到了: 一、脏工作区上的 baseline 是错的 变异被覆盖写入实现文件。如果文件本来就有未提交改动(上一轮被 background task 超时杀掉、Ctrl-C 中断、编辑器里改了一半),那么: - 捕获的「原始内容」不是已提交的源码,baseline 跑的是别的东西 - 留下的那个变异会被下一轮当成 baseline 两种情况下所有裁决都毫无意义,而 harness 仍然报出干净的分数 —— 正是 「判据失效」最坏的一种:它不报错。 改为直接拒绝运行(Go 版 t.Fatalf,Python 版退出码 2),并且不自动 checkout: 脚本分不清「残留变异」和「人正在改」,静默回退真实改动比停下来更糟。 二、注入必须原子,还原必须覆盖所有退出路径 Python 版原来用 open(path,"w"),就地截断。与它并发的构建(background go test、编辑器 gofmt、编译器自己读文件)可能看到写了一半的文件,报 syntax error,然后被当成 COMPILE 静默豁免 —— 一个真实的变异就这样被放过。 改为 tempfile + os.replace。还原登记到 atexit 与 SIGINT/SIGTERM。 三、路径必须相对当前目录 Go 版最初用 cwd=包目录 + 仓根相对路径,git 匹配不到任何东西,守卫永远不 触发。两个 harness 现在都用 ./name,各自在自己目录里跑 git。 两个方向都验证过:干净时全杀(discover 11/11、quota 12/12),脏时拒绝运行。