Page 25 - 《软件学报》2026年第7期
P. 25
2710 软件学报 2026 年第 37 卷第 7 期
JavaFuzzer; 同时, LumiX 在 Java 编译器和 JVM 上均能检测出一定数量的不一致缺陷, 而 JavaFuzzer 仅能在 JVM
上检测出少量的不一致缺陷. 这一对比结果表现出 LumiX 的有效性以及现有工作对 Java 编译器和 JVM 测试的
不充分. 其次, 通过对比 LumiX 和 LumiJ 的结果可以发现, LumiX 比 LumiJ 多检测出 8 个不一致缺陷, 缺陷检测效
果提升 47.0%. 这表明 LumiX 使用历史揭错测试程序作为种子程序的有效性. 尽管这些历史揭错测试程序中并不
包含 Java 新特性的程序特征, 但历史揭错测试程序中包含了大量历史揭错的程序特征, 这些特征结合新特性的代
码片段, 有助于生成复杂性更高的新特性测试程序. 最后, 通过对比 LumiJ 和 JavaFuzzer 的结果可以发现, LumiJ
比 JavaFuzzer 多检测出 14 个不一致缺陷, LumiJ 的效果同样显著优于 JavaFuzzer. 考虑到 LumiJ 中的种子程序为
JavaFuzzer 生成的随机测试程序, 这进一步表明了 LumiX 中方法的有效性. 同时, 这也表明 LumiX 可以增强现有
工具生成的测试程序, 从而使其具备对语言新特性进行测试的能力.
表 4 不一致缺陷数量对比分析
LumiX JavaFuzzer Fuzz4All LumiJ
OpenJDK 版本
编译器 虚拟机 编译器 虚拟机 编译器 虚拟机 编译器 虚拟机
OpenJDK 8 2 3 0 1 2 0 1 1
OpenJDK 11 3 4 0 0 1 0 3 1
OpenJDK 17 5 4 0 1 2 0 3 4
OpenJDK 21 3 1 0 1 1 0 3 1
总计 13 12 0 3 6 0 10 7
本实验进一步分析了 LumiX 显著优于 JavaFuzzer 以及 Fuzz4All 的原因. 对于 JavaFuzzer, 其设计的语法规则
均为较基础的 Java 语法, 且依赖随机生成策略, 难以生成高复杂度的测试程序, 因而导致生成程序在复杂性和多
样性上的不足. 相比之下, LumiX 利用大模型生成新特性代码片段扩充了对新特性的覆盖, 提升了测试程序的多样
性; 同时, LumiX 将生成的代码片段插入至历史揭错测试程序中, 并且增强与历史揭错测试程序上下文的交互, 进
一步提升了生成测试程序的揭错能力. 此外, JavaFuzzer 需要从零构造新的测试程序, 这导致其生成效率较低. 例
如, 在 OpenJDK 21 的实验中, 在 24 h 的测试时间中, LumiX 一共生成并执行了 3 919 个测试程序, 而 JavaFuzzer
仅生成并执行了 1 452 个测试程序. 现有研究工作表明 [25] , 生成效率直接影响方法效果, 因此 LumiX 在相同时间
内能够生成并执行更多测试程序, 从而取得更优的表现.
相较于 Fuzz4All, 尽管其同样依赖大语言模型生成新特性测试程序. 然而, Fuzz4All 并未针对语言新特性进行
系统性的总结, 即便本实验将语言新特性的文档作为补充输入给 Fuzz4All, 其检测效果仍然有限, 表现出对新特性
的覆盖不足. 同时, 其生成的测试程序规模普遍偏小, 平均仅有 20 行, 语法与控制流复杂性不足, 导致测试程序的
复杂性受限. 相比之下, LumiX 以历史揭错测试程序作为种子, 在此基础上利用大模型插入语言新特性相关的代码
片段生成新的测试程序, 使得生成测试程序平均规模达到 115 行, 语法结构与控制流路径更加丰富, 从而能够更有
效地揭示潜在缺陷.
4.3.2 研究问题 2: 代码覆盖率对比分析
图 9 展示了不同方法在 Java 编译器上取得的代码覆盖率随时间变化的曲线图. 从图 9 中可以看出, LumiX 相
较于其他方法可以取得更高的覆盖率. 首先, 通过比较 LumiX 与 JavaFuzzer 和 Fuzz4All 的结果可以发现, LumiX
生成的测试程序可以取得更高的代码覆盖率, 表明现有方法对 Java 编译器的测试是不充分的. 其次, 通过对比
LumiX 和 LumiJ 的结果可以发现, 相较于 JavaFuzzer 随机生成的测试程序, 历史揭错测试程序有助于提升 Java 编
译器的代码覆盖率. 这表明历史揭错测试程序中往往包含更复杂多样的程序特征, 有助于生成覆盖更多 Java 编译
器功能模块的测试程序. 最后, 通过对比 LumiJ 和 JavaFuzzer 的结果可以发现, 大模型生成的新特性代码片段有助
于大幅提升 Java 编译器的代码覆盖率. 其主要原因在于, 大模型生成的代码片段向种子程序中引入了新的程序元
素, 从而扩展了测试空间并提高了代码覆盖. 上述结果也进一步解释了研究问题 1 中 LumiX 优于其他方法的原因.
值得注意的是, 不同方法取得的代码覆盖率随时间的变化曲线均表现出较为稳定的趋势, 这表明不同方法在程序
测试的开始阶段就已经覆盖了大部分易于覆盖的代码模块. 而剩余尚未被覆盖的部分通常需要更智能化的引导策

