Page 11 - 《软件学报》2026年第7期
P. 11

2696                                                       软件学报  2026  年第  37  卷第  7  期


                 特性的解析和执行是否正确. 鉴于语言新特性通常体现在高级语言层面, 如语法糖, LumiX 选择在源代码层面生成
                 测试程序. 具体来说, LumiX     首先利用大模型强大的文本理解能力, 对使用自然语言描述的语言新特性进行总结,
                 从而概括获得语言新特性的使用描述. 该新特性使用描述包含了其使用场景、使用方法以及示例代码等摘要信
                 息. 随后, LumiX  利用大模型强大的代码生成能力, 根据新特性的使用描述, 生成能够覆盖新特性的代码片段. 为了
                 提升生成测试程序的揭错能力, LumiX          使用历史揭错测试程序作为种子程序, 为新生成的新特性代码片段提供丰
                 富的上下文信息. 同时, 为了增强种子程序与新特性代码片段之间的交互, LumiX                     利用程序分析工具对种子程序中
                 可复用的变量及函数信息进行提取, 结合新特性使用描述生成更复杂的代码片段. 新生成的代码片段将被插入至
                 种子程序中, 从而生成新的测试程序. 最后, LumiX            设计了双层的差分测试 (differential testing) 方法. 具体来说,
                 LumiX  首先利用不同的    Java 编译器 (即  javac 和  ECJ) 对生成的测试程序进行编译, 通过对比不同编译器的编译结
                 果来分析其是否检测出潜在的编译器缺陷. 随后, 为了进一步分析                     JVM  关于新特性的实现是否正确以及           Java 编
                                                  [4]
                 译器中是否存在错误编译 (miscompilation) , LumiX     利用不同的    JVM (即  HotSpot 和  OpenJ9) 对编译后的测试程
                 序进行执行, 通过对比不同        JVM  的执行结果来检测      JVM  中潜在的缺陷.
                    为了评估    LumiX  的有效性, 本文在    4  个长期维护的   OpenJDK  版本 (即  OpenJDK 8、11、17、21)、两个   Java
                 编译器 (javac 及  ECJ) 以及两个主流的    JVM  实现 (HotSpot 及  OpenJ9) 上进行了广泛的对比实验. 考虑到本文是针
                 对  Java 语言新特性的测试程序生成方法, 以及          LumiX  在源码层面上生成新的测试程序, 本文将            LumiX  与现有基
                 于规约的测试程序生成方法          JavaFuzzer 以及通用模糊测试工具      Fuzz4All [21] 进行对比. 同时, 本文设计了  LumiX  的
                 变体方法, 通过使用      JavaFuzzer 生成的测试程序作为种子程序, 从而评估本方法是否能有效提升现有工具对                       Java
                 语言新特性的测试能力. 实验结果表明, 相较于              JavaFuzzer 和  Fuzz4All, LumiX  能够有效生成覆盖  Java 语言新特
                 性的测试程序. 同时, LumiX     能够有效提升现有工具对          Java 语言新特性的测试能力. 特别地, 本文将          LumiX  应用
                 于最新版本的     Java 编译器以及   JVM  测试中, 累计发现    16  个未知缺陷, 其中    12  个已被开发人员确认或修复, 且部
                 分未知缺陷被开发人员标记为长期存在的缺陷.
                    本文的主要贡献总结如下.
                    ● 提出针对    Java 语言新特性的测试程序生成方法, 通过挖掘            Java 新特性文本描述, 结合大模型与程序分析生
                 成针对新特性的测试程序.
                    ● 在代码片段级别生成新特性测试代码, 结合历史揭错测试程序中丰富的上下文, 提升生成新特性测试程序
                 的揭错能力.
                    ● 设计并实现基于大语言模型的           Java 新特性测试程序生成方法        LumiX, 且将  LumiX  所有源代码及使用的数
                 据集进行开源     [22] , 促进后续研究的参考与使用.
                    ● 针对最新版本的      Java 编译器及  JVM  的测试结果表明, 本文方法能够有效生成针对新特性的测试程序, 以及
                 提升现有工作对新特性测试的覆盖能力. 累计发现                16  个未知缺陷, 其中   12  个均已被开发人员确认或修复.

                  1   相关工作

                    本节主要对     Java 测试程序生成的相关工作进行介绍, 针对的测试对象为                  Java 生态中的两大核心基础设施:
                 Java 编译器及  JVM, 涉及方法主要为基于规约以及基于变异的测试程序生成方法. 同时, 强调本文与现有工作的
                 区别以及本文的创新性.
                  1.1   基于规约的测试程序生成

                    基于规约的测试程序生成方法旨在通过设计特定编程语言的语法规则或人为设计的约束, 生成符合语法规则
                 或约束的测试程序      [4] . 通常来说, 基于规约的测试程序生成主要分为两类, 分别是: 随机差分测试 (random differential
                           [6–8]                     [23–27]
                 testing, RDT)  和程序合成 (program synthesis)  . 其中, 随机差分测试通过随机组合编程语言的语法规则, 从无
                 到有地随机生成符合目标语言语法规则的测试程序, 随后采用差分测试作为测试预言检测编译器中潜在的缺陷                                     [6] .
                 程序合成则通过设计特定的程序合成规则, 根据预定义的约束条件在种子程序                           (或模板程序) 上生成新的测试程
   6   7   8   9   10   11   12   13   14   15   16