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] 研究表明, 种子程序能够为生成的代码片段提供丰富的上下文信息, 从而提升生成测试程序的揭
   16   17   18   19   20   21   22   23   24   25   26