Page 26 - 《软件学报》2026年第7期
P. 26
赵英全 等: 基于大语言模型的 Java 新特性测试程序生成 2711
略, 例如, 覆盖率引导的测试程序生成方法 [51] . 这也促使后续的研究工作探索在大模型生成中引入覆盖率引导的
策略, 以进一步提升代码覆盖率, 进而增强缺陷检测效果.
30 30.55
28.95
27.35
代码覆盖率 (%) 25 LumiX 20.59
20
15
10
5 LumiJ
Fuzz4All
0 JavaFuzzer
0 2 4 6 8 10 12 14 16 18 20 22 24
测试时间 (h)
图 9 Java 编译器代码覆盖率随时间变化曲线图
图 10 展示了不同方法在 JVM 上取得的代码覆盖率随时间变化图. 从图 10 中可以看出, LumiX 相较于其他方
法同样可以取得更高的代码覆盖率. 不难看出, 图 10 和图 9 的覆盖率结果具有一定的相似性, 因此可以得出与图 9
相似的结论. 值得注意的是, Fuzz4All 在 JVM 上的代码覆盖率远小于其他方法, 尽管其在 Java 编译器上的覆盖率
高于 JavaFuzzer, 但受限于其生成的代码规模较小, 所以其在检测 JVM 缺陷上的效果很差. 进一步分析发现,
Fuzz4All 生成的测试程序能覆盖新特性语法但控制结构较为简单, 而 JavaFuzzer 虽缺乏新特性相关语法, 却包含
更复杂的控制结构 (如循环嵌套, 可触发 JVM 的 JIT 优化). 在未来的研究工作中可结合两者优势, 以提升缺陷检
测效果. 此外, LumiX 与 JavaFuzzer 在 JVM 上的代码覆盖率差异相较于 Java 编译器上的差异更小. 例如, 在 Java
编译器上, 不同方法执行结束后, LumiX 的代码覆盖率相较于 JavaFuzzer 提升了 9.96%. 而在 JVM 上, 在方法执行
结束后, LumiX 的代码覆盖率相较于 JavaFuzzer 仅提升了 7.6%. LumiX 相较于 LumiJ 在两者代码覆盖率上的差
异变化不大, 这表明两者在此场景下的覆盖提升能力较为接近. 这也进一步表明, 语言新特性的体现往往更集中
于 Java 源码层面, 因此, 基于源码构造面向语言新特性的测试程序是更直接、有效的, 有助于提升编译阶段的测
试覆盖能力.
46.9
44.6
代码覆盖率 (%) 40 LumiX 31.8
39.3
30
20
LumiJ
10
JavaFuzzer
0 Fuzz4All
0 2 4 6 8 10 12 14 16 18 20 22 24
测试时间 (h)
图 10 JVM 代码覆盖率随时间变化曲线图
4.3.3 研究问题 3: 未知缺陷检测效果分析
表 5 展示了 LumiX 在最新版本的 Java 编译器和 JVM 上检测到的被确认及修复的未知缺陷. 其中, 缺陷 ID
列指开发人员为本文提交缺陷分配的标识符; 测试对象列为当前缺陷所影响的实现; 影响版本为缺陷影响的
OpenJDK 版本; 影响功能/特性则表明了当前缺陷是否是新特性相关缺陷, 如果不是, 则统计其影响的功能模块. 总
的说来, LumiX 一共向不同的 Java 编译器和 JVM 开发人员提交了 16 个未知缺陷, 其中 12 个已经被确认和修复.
其中, 部分缺陷在 Java 编译器中长期存在, 直至本实验才被成功检测出来. 例如, 第 2 节提到的 Bug #3792, 该缺陷
自 Lambda 表达式引入以来就一直存在, 且未能在官方的测试过程中被及时发现. 这表明当前对 Java 编译器部分

