[Paper] 使用语言模型为低资源语言方言的编译器引导 Fuzzers

发布: (2025年12月6日 GMT+8 01:00)
6 min read
原文: arXiv

Source: arXiv - 2512.05887v1

概览

本文介绍了 Germinator,一种能够自动为基于 MLIR 框架构建的编译器方言生成高质量测试种子的工具。通过将自动提取的方言语法与大型语言模型(LLM)相结合,作者实现了 跨所有方言 的模糊测试,同时仍然 能够有效暴露方言特定的 bug——这一直是低资源语言扩展开发者的痛点。

关键贡献

  • 方言无关的种子生成:直接从 MLIR 方言规范中提取形式语法,消除手工构建种子语料库的需求。
  • LLM 驱动的种子引导:利用预训练的大型语言模型从提取的语法中抽样生成多样、类型正确的程序,无需额外的训练数据。
  • 覆盖率引导的模糊测试集成:将 LLM 生成的种子输入标准的覆盖率引导模糊测试器,显著提升代码覆盖率指标。
  • 大规模实证验证:在六个 MLIR 项目、共 91 种方言上进行测试,显示相较于仅使用语法的基线,行覆盖率提升 10‑120 %。
  • Bug 发现:在 23 种此前没有自动化测试支持的方言中发现 88 条新 bug(其中 40 条已确认)。

方法论

  1. 语法提取 – 每个 MLIR 方言都附带声明式规范(例如 TableGen)。作者解析这些规范,自动构建捕获方言语法形式和类型约束的上下文无关语法。
  2. LLM 提示 – 将提取的语法转换为大型语言模型(如 GPT‑3.5)的提示,要求模型生成遵守语法规则的随机程序,从而把 LLM 变成“智能种子生成器”。
  3. 种子过滤 – 对生成的程序进行方言验证器的类型检查,仅保留通过检查的有效种子。
  4. 引导模糊测试 – 将验证后的种子喂给覆盖率引导模糊测试器(如 AFL++),随后模糊测试器在运行时覆盖率反馈的指导下对种子进行变异,以探索更深的编译器路径。
  5. 评估 – 作者将 Germinator 的种子集合与纯语法基线在行覆盖率和 bug 发现指标上进行比较,覆盖多个真实世界方言。

结果与发现

  • 覆盖率提升:在 91 种方言中,Germinator 的种子相较于仅使用语法的种子生成器,使行覆盖率提升 10 % 至 120 %
  • Bug 产出:模糊测试活动发现 88 条此前未知的 bug,其中 40 条已被方言维护者确认
  • 低资源成功:对于 23 种没有任何先前自动化测试生成器的方言,Germinator 仍能产生有效种子,证明该方法在资源匮乏的情况下亦可工作。
  • 可扩展性:从语法提取到 bug 发现的完整流水线在所有方言上均可自动运行,无需人工调参,展示了实际可扩展性。

实际意义

  • 加速编译器开发:构建新 MLIR 方言的团队可以将 Germinator 接入 CI 流水线,立即获得高覆盖率的测试套件,而无需编写种子语料库。
  • 降低维护开销:种子由方言规范重新生成,能够随语言特性演进保持同步,减少脆弱的测试套件维护工作。
  • 提升领域特定语言的可靠性:依赖自定义 DSL 的行业(如图形、机器学习、硬件设计)能够更早捕获细微的编译器崩溃,从而为终端用户提供更稳定的工具链。
  • 利用已有的 LLM 投资:已经使用 LLM API 的组织可以复用这些服务进行种子生成,将“可有可无”的 AI 能力转化为具体的质量保证资产。

局限性与未来工作

  • 依赖语法质量:如果方言的规范不完整或包含错误,提取的语法(进而种子)可能会遗漏关键构造。
  • LLM 提示敏感性:生成程序的多样性会随提示设计和模型版本而变化,针对边缘方言可能需要调优。
  • 运行时开销:相较于纯语法抽样,初始的 LLM 生成步骤会增加延迟,但该成本在整个模糊测试过程中被摊薄。
  • 未来方向:作者建议与类型推断引擎更紧密集成,以更早剔除无效种子;探索更小、微调的 LLM 以加速生成;以及将该方法扩展到除 MLIR 之外的其他可扩展编译器基础设施。

作者

  • Sairam Vaidya
  • Marcel Böhme
  • Loris D’Antoni

论文信息

  • arXiv ID: 2512.05887v1
  • 分类: cs.SE, cs.LG, cs.PL
  • 出版时间: 2025 年 12 月 5 日
  • PDF: Download PDF
Back to Blog

相关文章

阅读更多 »