Page 21 - 《软件学报》2026年第7期
P. 21
2706 软件学报 2026 年第 37 卷第 7 期
常编译, 而另一个抛出语法错误, 则表明两个 Java 编译器存在不一致行为. 对于此类不一致行为, LumiX 则会直接
输出不一致报告以及相应的揭错测试程序. 如果在编译差分阶段均未出现不一致行为, 且测试程序在两个 Java 编
译器上均成功编译, 则两个 Java 编译器均会生成对应的二进制字节码程序. 随后, LumiX 则会使用不同的 JVM 实
现 (HotSpot 和 OpenJ9) 分别执行两个编译器编译生成的字节码测试程序, 如图 8 中第 2 层差分所示. 如果在执行
阶段出现不一致行为, 即在两个编译器编译生成的字节码测试程序上的 4 次 JVM 执行中出现任意一个与其他执
行结果不一致的行为, LumiX 将会输出不一致报告以及相应的测试程序. 如果在编译和执行结束之后均未出现不
一致行为, 且测试程序可以正常地执行至程序结束, LumiX 则会将该测试程序放回至种子程序池中, 用于接收其他
新特性的代码片段.
4 实验设计与结果分析
本节将通过收集 Java 新特性并在两款主流的 Java 编译器以及两款主流的 Java 虚拟机上进行实证研究, 来检
验本文方法和工具的有效性.
4.1 研究问题
为了评估本文所提方法的有效性, 本文设计了以下 4 个研究问题.
RQ1: LumiX 是否能有效地生成触发 Java 新特性缺陷的测试程序?
RQ2: LumiX 是否能够取得更高的 Java 编译器及 JVM 代码覆盖率?
RQ3: LumiX 是否能够检测出 Java 编译器及 JVM 中与 Java 新特性相关的未知缺陷?
RQ4: LumiX 的各个组件在生成针对 Java 新特性的测试程序方面是否有效?
4.2 实验设置
4.2.1 语言新特性
为了对语言新特性进行测试, 本文选取 4 个长期支持 (long-term support, LTS) 版本的 OpenJDK (8、11、17 和
21) 作为测试版本, 分别收集对应 Java 8、Java 11、Java 17 和 Java 21 中可以用于测试的新特性. 具体来说, 每个
Java 版本对应一个特定的 Java 编程语言规范, 而 OpenJDK 则是该规范的标准开源实现, 代表了对应 Java 版本的实
际实现. 此外, 本文同样收集了 Java 9、Java 10、Java 12、Java 13、Java 14、Java 15 以及 Java 16 中引入的新特性.
尽管这些 Java 版本对应的 OpenJDK 并不是 LTS 版本, 但由于不同的 Java 版本需要向前兼容, 因此这些 Java 版本
中包含了部分在后续版本中依旧存在且可以用于本实验测试的新特性. 例如, 在 Java 9 中引入的反序列化过滤器
(ObjectInputFilter) 特性在后续版本中仍被保留, 可以用于 Java 11、Java 17 和 Java 21 中关于该特性实现的测试. 最
终, 在对收集到的 Java 语言新特性进行过滤和总结之后, 本文共整理出 52 个可用于测试的新特性描述, 如表 1 所示.
表 1 待测新特性描述
数量 Java 8 Java 11 Java 17 Java 21 总计
新特性数量 10 16 14 12 52
版本测试数量 10 26 40 52 -
表 1 中, “新特性数量”表示 4 个 LTS Java 版本中收集整理到的新增语言特性数量. 每个 Java 版本所统计的新
特性, 均为其前一个 LTS 版本发布之后、到当前版本发布之间所引入的全部新特性之总和. 例如, Java 11 的新特性
数量指的是 Java 9–Java 11 之间引入的所有新特性; Java 17 对应的是 Java 12–Java 17 之间的新特性; 以此类推. “版
本测试数量”则表示可用于当前 Java 版本进行测试的新特性描述数量. 由于 Java 向前兼容的特性, 后续版本通常保
留并支持之前版本中引入的语言特性. 因此, 较新版本的测试能力是递增的. 例如, Java 11 可用于测试 Java 8 引入的
新特性, Java 21 则能够覆盖之前所有版本中的语言新特性. 因此, Java 21 中的“版本测试数量”为全部新特性的总数.
4.2.2 种子程序及测试对象
文献 [23,24] 研究表明, 种子程序能够为生成的代码片段提供丰富的上下文信息, 从而提升生成测试程序的揭

