这篇文档属于类型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等),并能够针对特定语言特性生成多样化测试用例。
研究分为两大核心阶段:
目的:将用户提供的目标系统文档(如语言规范、API说明)压缩为高效的LLM输入提示(prompt)。
流程:
- 输入:用户提供的原始文档(如C++标准库文档)。
- 蒸馏模型(Distillation LLM):使用GPT-4生成多个候选提示,通过高温采样(temperature=1)增加多样性。
- 评分与选择:用生成模型(StarCoder)为每个提示生成30个测试输入,根据有效性(被目标系统接受的输入比例)选择最佳提示。
创新点:首次实现无需梯度优化的黑盒自动提示生成,直接面向模糊测试目标优化。
目的:通过迭代更新提示生成多样化测试输入。
流程:
- 初始输入:使用自动提示阶段选出的最佳提示。
- 动态策略:每次迭代从历史输入中采样一个示例,结合以下策略生成新输入:
- 生成新输入(generate-new):直接生成新代码片段;
- 变异现有输入(mutate-existing):修改示例代码;
- 语义等价变换(semantic-equiv):生成功能相同但语法不同的代码。
- 测试与验证:将输入提交至目标系统(如GCC编译器),通过用户定义的预言(oracle,如程序崩溃)检测缺陷。
技术亮点:通过示例和策略的动态组合,避免传统模糊测试的覆盖率瓶颈。
noexcept与std::optional的组合触发内部编译器错误;decltype中的throw语句导致段错误;std::expected),生成针对性测试用例。科学价值:
1. 首次将LLM的多语言理解能力与模糊测试结合,突破传统工具的语言局限性;
2. 提出自动提示生成和动态策略循环,为LLM在软件测试中的应用提供新范式。
应用价值:
- 通用性:支持6种语言,无需为每种语言单独开发测试工具;
- 可扩展性:通过文档输入轻松适配新语言特性;
- 实践性:在真实系统中发现大量未知缺陷,已被开发者修复并集成至测试套件。
(报告总字数:约1800字)