用 BUGFARM 给 AI 找麻烦:如何批量生成“既难发现又难修复”的合成 Bug

本文带你快速搞懂 BUGFARM 是什么、为何需要它、怎么用,以及它如何帮助科研团队更准确地评估 AI 缺陷检测与修复工具。


目录


一句话速览

BUGFARM 是一个无需训练的自动化框架:

  1. 把一段正常代码喂给它;
  2. 它找到“模型最不关注”的语句;
  3. 用 GPT-3.5 在这些语句里植入缺陷;
  4. 输出一批“看起来和原代码几乎一样,却藏了多处错误”的合成 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:手动安装

  1. 装好 miniconda → conda env create -f environment.yaml
  2. 额外装 tokenizer 工具(官方脚本 setup.sh 已包含)。
  3. 其余步骤同上。

运行成功后,在 output/bugs/ 能看到 JSON 格式的缺陷补丁,可直接导入 IDE 查看。


FAQ:关于 BUGFARM 的 12 个常见疑问

  1. BUGFARM 生成的 Bug 像不像真实缺陷?
    不像人类开发者写的 Bug,更像“AI 自己才会犯的错”。目的不是仿真,而是考验 AI。

  2. 能用在 Python / C++ 项目吗?
    框架语言无关,但目前脚本只实现了 Java 解析器。扩展别的语言需要换解析器。

  3. 为什么阈值 k 默认 10 %?
    论文实验发现 10 % 就能让检测模型 FNR 提升 40 %。再大收益递减,且可能改动过多。

  4. 可以一次生成超过 3 个变种吗?
    可以,改 N=5 或更高,但 LAS 行数有限时,LLM 容易给出重复补丁。

  5. 会不会把正确代码改崩?
    会。所有样本都要经过测试过滤,崩掉的直接丢弃。

  6. 模型权重从哪下载?
    environment.yaml 里已写好 Hugging Face 路径,脚本自动拉取。

  7. 需要 GPU 吗?
    推理阶段 CPU 也能跑,但 3090 上 68 ms 就能完成注意力分析,快不少。

  8. 生成的 Bug 如何命名?
    默认格式 {original_class}_{method}_bug{idx}.java,方便脚本批量处理。

  9. 怎么验证 Bug 是否等价?
    测试全部通过即“等价”。若测试不足,再人工评审。

  10. 可以商用吗?
    代码 MIT 协议,可商用,但论文强调“仅用于研究基准”。

  11. 能否换成 GPT-4?
    只需在 Bug Generator 模块改两行 API 调用即可,成本 ×10。

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