论文

GapForge:通过覆盖差距分析进行定向编译器模糊测试

GapForge: Directed Compiler Fuzzing via Coverage-Gap Analysis

摘要

现代编译器代码库(例如 GCC 和 LLVM)庞大且复杂,使得跨不同代码区域的全面覆盖极具挑战性。大多数现有的测试生成技术都会忽略目标代码的特征,生成仅执行目标代码的有限子集的测试程序。因此,大量编译器区域仍未得到充分测试,从而在各个版本之间留下持续的长尾覆盖差距。即使现有的白盒技术在大规模编译器上的覆盖范围也有限。为了提高编译器覆盖率,特别是对于难以到达的边缘区域,我们推出了 GapForge,这是一种基于 LLM 的有针对性的测试生成技术,可以解释覆盖率差距。与生成不同输入而无需对它们所使用的区域进行建模的程序驱动技术不同,也与产生粗略指导的整个文件摘要不同,GapForge 通过三个步骤将覆盖差距视为明确的区域级目标。首先,它通过覆盖率驱动的评分对文件进行优先级排序,该评分有利于大型、隐蔽的文件。其次,它将每个未覆盖的行跨度与其封闭的覆盖上下文配对,并执行路径差异分析以推断细粒度的触发要求:到达未覆盖区域所需的程序结构和编译选项。第三,它综合了这些要求和以前失败的提示的提示,使用覆盖率反馈来指导下一轮选择。在 GCC 14.3.0 和 LLVM 19.1.0 上,GapForge 的性能显着优于八种最先进的技术。在 72 小时内,它在 GCC 和 LLVM 中的核心编译器模块上实现了 68.13% 和 69.11% 的覆盖率,分别超过了白盒技术 WhiteFox 24,736 和 19,798 行。此外,GapForge 发现了 12 个现实世界的编译器故障(5 个在 GCC 中,7 个在 LLVM 中),其中包括 8 次崩溃和 4 次错误编译,每个组件都会影响其性能。