Page 91 - 《软件学报》2025年第4期
P. 91
香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述 1497
由复杂 API 序列触发的漏洞方面的能力. 虽然模型级别测试技术可以潜在地测试深度学习库 API 序列, 但是, 变
异规则通常有严格的约束, 导致成本高昂且测试效果有限. 例如, LEMON 的层添加规则不能应用于具有不同输入
和输出形状的层, 而 Muffin 需要手动注释 API 的输入和输出约束, 并使用额外的重塑操作来确保层间有效的连
接. 因此, 模型级别和 API 级别的深度学习库测试技术只能覆盖有限的 API 范围, 无法生成 API 序列进而挖掘复
杂的深度学习库漏洞.
因此, 目前模型级别和 API 级别的测试技术都面对着人工成本和修复性能平衡的关键挑战. 如果使用简单的,
完全自动化的技术, 那深入探索深度学习库的程序状态就非常困难. 例如 LEMON 和 AUDEE 技术尽管使用了经
过细致调整的变异规则, 其效果仍十分有限. 而如果使用比较复杂, 可以深入探索深度学习库 API 状态的技术, 则
需要耗费大量的人力成本. 例如, DocTer 技术需要人工构建规则提取文档特定信息以及手动注释一些 API 约束,
Muffin 技术同样需要手动注释 API 约束保证变异的有效性. 综上, 如何进一步平衡人工成本和修复性能, 高效地
生成符合深度学习库约束的测试, 是这两类技术的关键挑战.
2.3 基于大模型的深度学习库测试技术
大模型在自然语言和代码任务上的优越表现, 吸引了大量研究者的注意. 相较于模型级别和 API 级别测试依
PyTorch
赖人工构建变异规则和手动注释 API 约束的方式, 大模型在处理深度学习库 API 约束和测试代码生成等方面有
以下特性.
(1) 语义和语法理解: 大模型通过在大量代码库上进行预训练, 学习了编程语言的语义和语法规则 (例如,
GitHub 上有超过 400 000 个 TensorFlow/PyTorch 项目). 这使其能够生成复杂且有效的代码片段, 从而深入挖掘深
度学习库内部的复杂漏洞.
(2) 自然生成测试用例: 大模型的自回归生成性质使得它们可以基于给定的上下文 (例如, 一段代码的开始部
分或者特定的 API 调用) 生成后续的代码. 该特性可以用于生成一系列复杂的 API 调用, 从而可以模拟真实应用
场景下深度学习库的行为.
(3) 理解复杂类型和约束: 在训练期间, 大模型会在具有复杂 API 调用和类型约束的代码上进行训练并理解这
些特征. 该特性使得即使在深度学习库 API 调用或数据类型非常复杂的情况下, 大模型仍然能够生成满足这些约
束的测试输入, 对深度学习库进行有效的测试. 这个特性可以令大模型作为高效的深度学习库 API 的约束分析器,
自动理解分析深度学习库 API 的输入输出约束, 生成合法的测试输入.
(4) 灵活且自动化的代码突变: 大模型可以根据简单的提示以及自身所具备的随机性生成新的代码片段来替
换已有的代码, 从而创建新的测试用例. 这个特性使得大模型本身可以作为强大的模糊测试变异器, 自动地对种子
进行变异, 以完成对深度学习库的模糊测试.
因此, 研究者尝试应用大模型到深度学习库测试任务上. Deng 等人 [50] 率先提出了基于大模型的自动化深度学
习库测试技术 TitanFuzz. 该技术首先在生成式的大语言模型上通过逐步输入提示以产生初始种子程序. 然后
TitanFuzz 使用大模型自动突变种子程序来产生新的测试程序以丰富测试程序的种子池. 最后, 该技术在不同的后
端上使用差分测试执行生成的测试程序以检测漏洞. 实验结果表明, TitanFuzz 在发现漏洞数量, 漏洞多样性以及
生成 API 序列多样性方面均优于传统技术, 并且在 和 TensorFlow 两个深度学习框架中发现了 30 个新的
漏洞, 其中 27 个已经被开发者确认并修复.
在 TitanFuzz 基础上, Deng 等人 [21] 考虑到大模型学习的深度学习库代码已被世界各地的开发人员使用, 普通
的测试程序几乎无法帮助覆盖额外的深度学习库行为/路径, 从而导致 TitanFuzz 模糊测试深度学习库的效果有限.
进而他们基于一个已知假设: 历史触发漏洞的程序可能包含对查找漏洞重要的边际情况或有价值的代码部分, 构
建了 FuzzGPT. 该技术利用历史漏洞程序, 隐含地学习了深度学习库的约束条件 (包括语法/语义、深度学习计算
约束以及新的异常约束), 并且能够完全自动化地进行测试. 通过收集目标深度学习库的漏洞报告以及触发漏洞的
代码片段作为数据集, FuzzGPT 使用以下两个策略增强模型的测试能力: (1) 上下文学习: 研究者为大模型提供一
些历史触发漏洞的程序, 以生成新的代码片段或自动完成部分代码; (2) 微调: 研究者通过在提取的历史触发漏洞