网易首页 > 网易号 > 正文 申请入驻

我的代码检查工具,在最好的代码上准确率最低

0
分享至

昨天我把一个叫 deadgate 的工具发布到了 PyPI。它读取 GitHub Actions 工作流,找出那些"无法失败"的检查:一个被跳过的任务满足的必需门禁、一个被管道吞掉的退出状态、一个从不读取上游是否通过的汇聚任务。

然后我把它指向了 Arize-ai/openinference,1.2k 星标,22 个工作流。它报告了 13 个高危发现。


其中 12 个是误报。

不是模棱两可的误报,也不是"技术上成立但影响很小"的那种。那个仓库的 CI 配置完全正确,是我的工具看不见它。而做报告的那个版本,已经在 PyPI 上挂了大约一个小时。

它看不见官方推荐的写法

GitHub 官方文档里,询问"上游是否有任何东西失败了"的标准写法是通配符形式:用 contains(needs.*.result, 'failure') 来判断。

我的检测器用正则 needs\.[A-Za-z0-9_-]+\.(result|outputs) 去匹配,这个表达式根本匹配不到星号。于是文档推荐的那一种写法,恰好是工具完全看不见的那一种。每一个写得正确的汇聚门禁,都被报告成了"无法失败的门禁"。

更讽刺的是,那条误报自己的提示信息里写着"从未读取 needs.*.result"——而它恰恰没能匹配上这个字符串。

我修复了它,发布了 0.1.1 版本,然后把修复后的版本指向了 astral-sh/ruff。21 个高危发现。18 个是误报。Ruff 用了第三种写法:通过环境变量把整个 needs 对象转成 JSON,再用 jq 去筛选所有 result 不等于 success 也不等于 skipped 的条目。这种写法一次性读取所有上游,而"result"这个词根本不出现在任何工作流表达式里。我的模式匹配无从下手。

第四类问题不在拼写上

第四类根本不是拼写问题。scikit-learn 有一个任务调用了可复用工作流,所以它只有 uses 没有 steps,它通过任务级别的 with 传递 needs.check-sdist.result。这个表达式我完全理解,它只是待在一个我没在看的地方——我扫描的是步骤级别的 with,不是任务级别的 with。

四类问题。前两类已经发布到了 PyPI。第三类和第四类,是我不断把"已修复"的版本指向新仓库、而不是宣布胜利之后才发现的。

下面这个数字才是关键。在一个包含 275 个仓库、4543 个文件的语料库上,用两个版本读取完全相同的字节:

40% 的高危发现是误报。

这听起来很糟,但它还低估了问题的严重性,因为 40% 只是一个平均值,而错误并不是均匀分布的。

那 275 个仓库里,只有 15 个使用了通配符写法。误报集中堆在了那些把门禁写得很仔细的仓库上。在 openinference 上误报率是 92%,在 ruff 上是 86%。而在一个根本没有汇聚门禁的仓库上,误报率是零——因为压根没有东西可被误读。

我的检查工具,在最好的代码上准确率最低。

语料库平均值掩盖了一切

如果一个工具在烂代码上很吵,噪音和信号会一起到达,你会两个都读。但如果它偏偏在好代码上很吵,那些把工作做对的人反而成了被惩罚的对象,而最自然的反应就是不再运行它。语料库平均值无法暴露这一点,因为语料库里大部分是普通仓库,工具碰巧在那里是对的。

我手里有那个语料库。我跑了它。它告诉我 40%,我本来会把这个数字当作头条发布出去。真正发现问题的,是把工具指向两个我本来就尊重的 CI 配置。

为了停止报告那些失败已经被门禁捕获的任务,我沿着 needs 图做了传递性遍历:如果一个门禁覆盖了 ci,而 ci 需要 changes,那么 changes 也被覆盖了。

我对这个修复做了变异测试——对我来说,这意味着把每个测试声称能捕获的缺陷种进去,然后检查是否有东西变红。有一个变异存活了下来:那个删掉传递性遍历的变异。

我的第一反应是缺了一个测试。但不是。变异存活是因为那个遍历本身就是错的:needs.*.result 只报告直接依赖,而一个失败的祖父节点会让父节点被跳过,跳过不是失败,所以门禁永远看不到它。做传递性遍历反而会压制掉真实的发现。

一个存活的变异体有两种含义,很容易混淆。要么是缺了一个测试,要么是那段代码什么都没做。如果我当时写一个测试去杀掉它,我就会把一个 bug 钉在原地,然后管它叫覆盖率。

我公开更正了一个正确的数字

在修这些的过程中,我注意到我有五个仓库的 README 里宣传了一个过时的测试数量。我手动更正了它们,并加了一个 CI 检查,防止它们再次漂移。

这个检查立刻变红了。在一个我刚"更正"过的数字上。

我把 agent-graph 的 README 从 42 改成了 58,还写了一条公开的提交信息,说上一个提交把数量夸大成 67 了。CI 收集到的是 67。我的本地虚拟环境缺了一个可选依赖,而 tests/test_rag.py 开头是 pytest.importorskip,于是九个测试在收集阶段就消失了,没有报错、没有警告、也没有提到那个文件。pytest 说"收集到 58 个测试",它是认真的。

原来的数字是对的。我用一个并非真实环境的测量结果,公开更正了一个正确的说法。

我一小时前发布的那个检查有同样的盲点,并且同意了 58。它现在会在磁盘上任何测试文件贡献零个被收集测试时失败,因为那是环境不完整的唯一证据。

上面这些扫描是由我自己的测试框架驱动的,它背后的 agent 脚手架、门禁实现和提示词都不在仓库里,也不会放进去。deadgate 本身很小,MIT 协议,你可以读它的全部代码。那个把它指向 275 个仓库并对存活者进行分类的东西,是我要保留的部分。

我不知道如何在没有一批好代码样本的情况下,测试一个检查工具的这一类错误,而"好代码"并不是我能自动检测的属性。语料库给你体量,体量给你平均值,而平均值恰恰是掩盖了这件事的那个统计量。

唯一有效的东西是品味:挑两个我本来就相信工程做得好的仓库。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
深圳楼市,爆了!

深圳楼市,爆了!

睿见投资
2026-10-08 18:55:24
1:6局面出现,中国在联合国遭围攻,美国全程沉默,中方强势反击

1:6局面出现,中国在联合国遭围攻,美国全程沉默,中方强势反击

趣文说娱
2026-10-09 11:23:12
医院接诊多例“汞超标”患儿,涉事银鳕鱼产品已不再标注“儿童装”

医院接诊多例“汞超标”患儿,涉事银鳕鱼产品已不再标注“儿童装”

澎湃新闻
2026-10-09 15:48:29
永州市商务局局长人美心善,前夫拿330万精神赔偿费还要闹,恐怕都会被追缴

永州市商务局局长人美心善,前夫拿330万精神赔偿费还要闹,恐怕都会被追缴

汉史趣闻
2026-10-09 10:45:27
特朗普称与普京达成协议:俄罗斯将向美国及全球市场供应大量柴油

特朗普称与普京达成协议:俄罗斯将向美国及全球市场供应大量柴油

财联社
2026-10-10 04:18:03
454票通过反华决议!欧盟访华前欧洲议会放狠话:中国只听得懂实力的语言

454票通过反华决议!欧盟访华前欧洲议会放狠话:中国只听得懂实力的语言

观星赏月
2026-10-09 06:54:57
永州女局长的情色大瓜,到底应该怎么吃

永州女局长的情色大瓜,到底应该怎么吃

谷小九
2026-10-09 18:57:37
高三老师面相吓到网友,堪称“骨灰级别”,就算这样也舍不得化妆

高三老师面相吓到网友,堪称“骨灰级别”,就算这样也舍不得化妆

世界圈
2026-10-08 09:21:41
如果郑钦文晋级中网决赛,将有三大收获:410万奖金+排名重返前30

如果郑钦文晋级中网决赛,将有三大收获:410万奖金+排名重返前30

侃球熊弟
2026-10-10 00:35:05
两“虎”被开除党籍:连辑以“润笔费”名义收钱,丁业现占用客房供个人使用

两“虎”被开除党籍:连辑以“润笔费”名义收钱,丁业现占用客房供个人使用

界面新闻
2026-10-09 17:23:22
居民医保个人缴费连续三年不涨,2027年仍为400元

居民医保个人缴费连续三年不涨,2027年仍为400元

第一财经资讯
2026-10-09 16:22:08
舆论反转!尊界踏板支架断裂事件,余承东淡定反应获网友力挺,直言“余总这波,输没输产品另说,至少没输人”

舆论反转!尊界踏板支架断裂事件,余承东淡定反应获网友力挺,直言“余总这波,输没输产品另说,至少没输人”

火山詩话
2026-10-09 14:57:30
我已经50岁了,二婚没多久就开始恶心呕吐,去医院一查竟然是怀孕

我已经50岁了,二婚没多久就开始恶心呕吐,去医院一查竟然是怀孕

千秋文化
2026-07-04 19:16:43
2名内地女学生在澳门旅拍,当场被截获!警方披露详情

2名内地女学生在澳门旅拍,当场被截获!警方披露详情

环球网资讯
2026-10-09 16:58:08
上海双加时险胜辽宁:拉塞尔首秀18+7+9 张镇麟17分麦基18分

上海双加时险胜辽宁:拉塞尔首秀18+7+9 张镇麟17分麦基18分

醉卧浮生
2026-10-09 17:06:10
随着C罗破门+利雅得胜利3-0,吉达国民4-0,沙特联最新积分榜出炉

随着C罗破门+利雅得胜利3-0,吉达国民4-0,沙特联最新积分榜出炉

侧身凌空斩
2026-10-10 04:00:20
中国赛-申京三双火箭大胜独行侠 杜兰特15分范乔丹复出17+7

中国赛-申京三双火箭大胜独行侠 杜兰特15分范乔丹复出17+7

醉卧浮生
2026-10-09 22:31:29
新华社删除尊界汽车,彻底结束了!

新华社删除尊界汽车,彻底结束了!

财经三分钟pro
2026-10-09 16:32:40
C罗获评8.6分+加冕MVP:机敏跑位轻松破门,现场视角,太丝滑了

C罗获评8.6分+加冕MVP:机敏跑位轻松破门,现场视角,太丝滑了

侧身凌空斩
2026-10-10 03:56:41
广东省委:坚决拥护党中央决定

广东省委:坚决拥护党中央决定

新京报政事儿
2026-10-09 13:42:07
2026-10-10 07:20:49
Ping值焦虑
Ping值焦虑
有态度网友ytd
188文章数 109关注度
往期回顾 全部

科技要闻

华为小米手机同日涨价,最高涨1000元

头条要闻

七旬大伯在浙江买山景别墅养老 住进去后天天提心吊胆

头条要闻

七旬大伯在浙江买山景别墅养老 住进去后天天提心吊胆

体育要闻

与C罗硬碰硬,一个72岁老人的倔强

娱乐要闻

吴奇隆宣布重要决定,走上谢霆锋老路

财经要闻

时隔12年,公募基金运作办法修订

汽车要闻

2027款深蓝L06及追风版上市 限时权益价11.49万元起

态度原创

房产
亲子
本地
家居
公开课

房产要闻

475万人,猛增13.1%!国庆海南,又爆了?

亲子要闻

请叫我呆萌小可爱 骗你生女儿

本地新闻

转型再出发 奋勇打头阵

家居要闻

2026建博会(广州) 公装联探展交流活动

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版