用 BUGFARM 给 AI 找麻烦:如何批量生成“既难发现又难修复”的合成 Bug
本文带你快速搞懂 BUGFARM 是什么、为何需要它、怎么用,以及它如何帮助科研团队更准确地评估 AI 缺陷检测与修复工具。
目录
-
一句话速览 -
我什么时候会需要 BUGFARM? -
BUGFARM 的工作流程 -
动手实验:十分钟跑通首个 Bug 生成 -
FAQ:关于 BUGFARM 的 12 个常见疑问 -
与 LEAM、μBERT 的横向对比 -
如何阅读并重用论文数据 -
一句话总结
一句话速览
BUGFARM 是一个无需训练的自动化框架:
-
把一段正常代码喂给它; -
它找到“模型最不关注”的语句; -
用 GPT-3.5 在这些语句里植入缺陷; -
输出一批“看起来和原代码几乎一样,却藏了多处错误”的合成 Bug,用来考验 AI 缺陷检测和自动修复工具。
我什么时候会需要 BUGFARM?
场景 | 是否值得用 BUGFARM? |
---|---|
正在开发新的缺陷检测模型,需要大量“难样本” | ✅ |
想验证现有 AI 修复工具会不会“漏网之鱼” | ✅ |
只想找传统测试能发现的小 Bug | ❌(BUGFARM 目标不是这类) |
需要真实生产环境 Bug | ❌(BUGFARM 合成的是 AI 误判场景,非人类失误) |
BUGFARM 的工作流程
1. 方法抽取(Method Extractor)
-
支持 Maven 项目,直接扫描 .java
文件。 -
输出:所有方法的方法签名 + 方法体(不含注释)。
2. 注意力分析(Attention Analyzer)
-
输入:预训练 Transformer(CodeBERT / CodeT5 / NATGEN)。 -
输出:每个 token 的“注意力权重”,再聚合成每条语句的“被关注度”。 -
规则:关注度最低的 10 % 语句被标为候选植入点(LAS)。
3. Bug 生成(Bug Generator)
-
用自然语言 prompt 把“原方法 + LAS 行号”发给 GPT-3.5。 -
要求: -
只在 LAS 行内修改; -
保持语法正确; -
保证和原代码表征差异极小。
-
-
过滤:语法错误、改动超出 LAS 的样本全部丢弃。
4. 自动确认(Validation)
-
编译 → 跑原测试 → 测试失败才算“确认 Bug”。 -
未触发失败的样本再请 97 位人工评审,确保公平。
动手实验:十分钟跑通首个 Bug 生成
Option A:Docker(最省事)
# 1. 克隆仓库(地址见文末)
git clone https://github.com/projectinvestigator/BUGFARM
cd BUGFARM
# 2. 构建镜像
docker build -t bugfarm .
# 3. 进入容器
docker run -it bugfarm bash
# 4. 运行示例
python -m src.attention_analyzer --project sample-maven
python -m src.bug_generator --method sample-maven/src/Util.java:42
第一次跑会下载模型权重,约 2 GB,耐心等。
Option B:手动安装
-
装好 miniconda → conda env create -f environment.yaml
-
额外装 tokenizer 工具(官方脚本 setup.sh
已包含)。 -
其余步骤同上。
运行成功后,在
output/bugs/
能看到 JSON 格式的缺陷补丁,可直接导入 IDE 查看。
FAQ:关于 BUGFARM 的 12 个常见疑问
-
BUGFARM 生成的 Bug 像不像真实缺陷?
不像人类开发者写的 Bug,更像“AI 自己才会犯的错”。目的不是仿真,而是考验 AI。 -
能用在 Python / C++ 项目吗?
框架语言无关,但目前脚本只实现了 Java 解析器。扩展别的语言需要换解析器。 -
为什么阈值 k 默认 10 %?
论文实验发现 10 % 就能让检测模型 FNR 提升 40 %。再大收益递减,且可能改动过多。 -
可以一次生成超过 3 个变种吗?
可以,改N=5
或更高,但 LAS 行数有限时,LLM 容易给出重复补丁。 -
会不会把正确代码改崩?
会。所有样本都要经过测试过滤,崩掉的直接丢弃。 -
模型权重从哪下载?
environment.yaml
里已写好 Hugging Face 路径,脚本自动拉取。 -
需要 GPU 吗?
推理阶段 CPU 也能跑,但 3090 上 68 ms 就能完成注意力分析,快不少。 -
生成的 Bug 如何命名?
默认格式{original_class}_{method}_bug{idx}.java
,方便脚本批量处理。 -
怎么验证 Bug 是否等价?
测试全部通过即“等价”。若测试不足,再人工评审。 -
可以商用吗?
代码 MIT 协议,可商用,但论文强调“仅用于研究基准”。 -
能否换成 GPT-4?
只需在Bug Generator
模块改两行 API 调用即可,成本 ×10。 -
会不会把私有代码泄露给 OpenAI?
会的,如果在意隐私,请把 prompt 本地化,改用离线 LLaMa 等模型。
与 LEAM、μBERT 的横向对比
维度 | BUGFARM | LEAM | μBERT |
---|---|---|---|
需不需要训练 | 不需要 | 需要 24h | 不需要 |
单方法生成 Bug 数量 | 3(可配) | 不定 | 不定 |
平均改动语句数 | 3.2 行 | 2.7 行 | 2.0 行 |
检测模型 FNR 提升 | +40 % | 基线 | 基线 |
修复成功率(FitRepair) | 28 % | 36 % | 49 % |
生成耗时(单方法) | 9 秒 | 35 秒 | 28 秒 |
与已有 Bug 重叠度 | 7.6 % | — | 4 % |
一句话总结:BUGFARM 牺牲了一点点修复成功率,换来对检测模型的“大杀器”。
如何阅读并重用论文数据
所有实验结果都已上传到 Zenodo,永久开放:
https://doi.org/10.5281/zenodo.13886318
文件名 | 内容 |
---|---|
mutants.zip |
已确认的全部 43 万个 Bug,含源码 + 补丁 |
defect_datasets.zip |
用于训练检测模型的 5 大基准 |
apr.zip |
FitRepair 对每个 Bug 的 100 个修复补丁 |
human_study.zip |
97 位评审员对 300 个存活样本的投票结果 |
想复现表格或跑自己的模型,直接 unzip
后用脚本解析即可。
一句话总结
BUGFARM 像一支“AI 红队”:
不训练、不模仿、不迎合,只盯着模型的盲区精准打击。
如果你在做缺陷检测或自动修复,值得把它放进工具箱。