用 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 红队”:
不训练、不模仿、不迎合,只盯着模型的盲区精准打击。
如果你在做缺陷检测或自动修复,值得把它放进工具箱。

