分享自:

Fuzz4All:基于大型语言模型的通用模糊测试

期刊:2024 IEEE/ACM 46th International Conference on Software EngineeringDOI:10.1145/3597503.3639121

这篇文档属于类型a,即报告了一项原创性研究。以下是针对该研究的学术报告:


作者及发表信息

本研究由Chunqiu Steven Xia(美国伊利诺伊大学厄巴纳-香槟分校)、Matteo Paltenghi(德国斯图加特大学)、Jia Le Tian(伊利诺伊大学厄巴纳-香槟分校)、Michael Pradel(斯图加特大学)和Lingming Zhang(伊利诺伊大学厄巴纳-香槟分校)共同完成,发表于2024年的IEEE/ACM 46th International Conference on Software Engineering (ICSE ‘24)


学术背景

研究领域:本研究属于软件工程中的模糊测试(Fuzzing)领域,专注于利用大语言模型(Large Language Models, LLMs)提升多语言程序测试的通用性和有效性。

研究动机:传统模糊测试工具存在三大局限性:
1. 语言耦合性(C1):现有工具通常针对单一语言设计(如Csmith仅支持C/C++),难以迁移到其他语言;
2. 缺乏演进支持(C2):无法适应语言新特性(如C++23);
3. 生成能力受限(C3):基于语法规则或变异的输入生成难以覆盖复杂语言特性。

研究目标:提出Fuzz4All——首个基于LLM的通用模糊测试框架,支持多语言输入(如C、C++、SMT2、Go等),并能够针对特定语言特性生成多样化测试用例。


研究流程

研究分为两大核心阶段:

1. 自动提示生成(Autoprompting)

目的:将用户提供的目标系统文档(如语言规范、API说明)压缩为高效的LLM输入提示(prompt)。
流程
- 输入:用户提供的原始文档(如C++标准库文档)。
- 蒸馏模型(Distillation LLM):使用GPT-4生成多个候选提示,通过高温采样(temperature=1)增加多样性。
- 评分与选择:用生成模型(StarCoder)为每个提示生成30个测试输入,根据有效性(被目标系统接受的输入比例)选择最佳提示。
创新点:首次实现无需梯度优化的黑盒自动提示生成,直接面向模糊测试目标优化。

2. 模糊测试循环(Fuzzing Loop)

目的:通过迭代更新提示生成多样化测试输入。
流程
- 初始输入:使用自动提示阶段选出的最佳提示。
- 动态策略:每次迭代从历史输入中采样一个示例,结合以下策略生成新输入:
- 生成新输入(generate-new):直接生成新代码片段;
- 变异现有输入(mutate-existing):修改示例代码;
- 语义等价变换(semantic-equiv):生成功能相同但语法不同的代码。
- 测试与验证:将输入提交至目标系统(如GCC编译器),通过用户定义的预言(oracle,如程序崩溃)检测缺陷。
技术亮点:通过示例和策略的动态组合,避免传统模糊测试的覆盖率瓶颈。


主要结果

1. 覆盖率对比实验

  • 测试对象:6种语言的9个系统(如GCC、Clang、Qiskit等)。
  • 基线工具:包括Csmith(C)、YarpGen(C++)、TypeFuzz(SMT2)等。
  • 结果
    • Fuzz4All在所有语言中覆盖率显著优于基线(平均提升36.8%);
    • 例如,在GCC测试中覆盖198,927行代码(比GrayC高18.8%),在量子计算平台Qiskit中覆盖34,988行(比MorphQ高75.6%)。
    • 数据支持:24小时测试中,Fuzz4All持续覆盖新代码,而传统工具很快进入平台期。

2. 缺陷检测

  • 总计发现98个缺陷,其中64个被开发者确认为未知漏洞。
  • 典型案例
    • GCCnoexceptstd::optional的组合触发内部编译器错误;
    • Clangdecltype中的throw语句导致段错误;
    • Qiskit:量子电路导出QASM时因命名冲突崩溃。

3. 定向模糊测试(Targeted Fuzzing)

  • 功能:通过提供特定特性文档(如C++23的std::expected),生成针对性测试用例。
  • 结果:目标特性命中率平均达83%,而通用测试的命中率仅4.38%。

结论与价值

科学价值
1. 首次将LLM的多语言理解能力与模糊测试结合,突破传统工具的语言局限性;
2. 提出自动提示生成动态策略循环,为LLM在软件测试中的应用提供新范式。

应用价值
- 通用性:支持6种语言,无需为每种语言单独开发测试工具;
- 可扩展性:通过文档输入轻松适配新语言特性;
- 实践性:在真实系统中发现大量未知缺陷,已被开发者修复并集成至测试套件。


研究亮点

  1. 方法创新
    • 首个无需人工设计生成规则或变异算子的通用模糊测试框架;
    • 通过LLM隐式学习语言语法与语义,生成高多样性输入。
  2. 工程贡献
    • 实现仅872行代码的轻量级工具,远少于Csmith(8万行);
    • 公开代码与数据集(Zenodo DOI: 10.5281/zenodo.10456883)。
  3. 跨领域意义:为LLM在程序分析、编译器测试等领域的应用开辟新方向。

其他价值

  • 缺陷复现:部分测试用例被纳入GCC官方测试集,验证了生成代码的可靠性;
  • 资源效率:尽管LLM推理成本较高,但通过蒸馏模型(GPT-4)与生成模型(StarCoder)的协同设计平衡了性能与成本。

(报告总字数:约1800字)

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com