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 编译器部分
   21   22   23   24   25   26   27   28   29   30   31