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

赵英全 等: 基于大语言模型的        Java 新特性测试程序生成                                           2713


                 特性 (JEP 264 [52] ). 在该测试程序中, LumiX  将新生成的代码片段插入在函数         mainTest 中, 然后, 该函数会在第    6、
                 7  行通过反射无限递归地调用        mainTest 函数本身. 通过利用不同的       JVM  执行该测试程序, HotSpot 会陷入无限递
                 归调用的死循环, 而      OpenJ9  则会在执行一段时间后产生崩溃. 这表明           OpenJ9  在处理包含  String.Logger 的无限递
                 归调用时存在潜在的缺陷. 本文随即将其提交给               OpenJ9  的开发人员. 目前, 开发人员已经对缺陷进行了修复.


                                1 public static void mainTest(String[] strArr1) {
                                2   for (int i = 1; i < 5; i++) {
                                3    System.Logger logger = System.getLogger(Test.class.getName());
                                4    logger.log(System.Logger.Level.INFO, “Logging example”);
                                5    try {
                                6      java.lang.reflect.Method method = Test.class.getMethod(“mainTest”, String[].class);
                                7      method.invoke(this, (Object)strArr1);
                                8    } catch(NoSuchMethodException e) {
                                9      …  //സ੻ӱ྽ၳӈეओ
                               10    }
                               11  }
                               12  …
                               13 }
                                                图 12 OpenJ9  缺陷  (Bug #21419)

                  4.3.4    研究问题  4: 关键组件消融效果分析
                    为了评估    LumiX  不同组件对缺陷检测的贡献, 本实验分别对新特性使用描述总结组件以及代码片段生成组
                 件进行消融. 具体来说, 分别使用新特性完整描述替换使用新特性使用描述总结以及生成完整的测试程序替换生
                 成代码片段, 来验证两个组件对          LumiX  效果的影响. 此外, 本实验进一步探索了不同大模型对              LumiX  效果的影响.
                 接下来本实验将分别对这         3  组实验的结果进行分析.
                    表  6  展示了使用描述总结组件的消融实验对比分析结果, 其中                 w/o LumiXsum  指使用新特性完整描述替换使
                 用描述总结的方法. 为了从多角度评估方法的有效性, 本实验进一步设计了有效性指标及平均词元                                (token) 指标.
                 其中, 有效性指标代表方法生成可以正确编译, 或错误编译但触发编译器不一致的测试程序数量占总生成测试程
                 序数量的比例. 如果生成的测试程序包含语法错误且在不同的编译器之间语法错误一致, 则表明生成的测试程序
                 无效. 有效性指标越高代表方法生成的测试程序质量越高. 平均词元指标代表生成单个测试程序需要消耗的平均
                 词元数量, 平均词元的值越高代表生成测试程序的成本越高. 通过分析表                      6  中的结果可以发现, 两个方法在检测到

                 的不一致数量上没有显著的差异, LumiX           仅在  Java 编译器上比   w/o LumiXsum  多检测出一个缺陷. 其主要原因在
                 于, 一方面, LumiX  中的使用描述总结同样是基于大模型进行总结, 在文本理解和语义抽取上具备相似的能力; 另
                 一方面, 大语言模型本身具备一定程度的通用知识和代码相关背景知识, 因此在该任务中的表现趋于一致, 从而导
                 致两者在缺陷检测能力上的整体差异较为有限.

                                            表 6 使用描述总结组件消融实验对比分析

                                              LumiX                              w/o LumiXsum
                  OpenJDK 版本
                               编译器    虚拟机    有效性 (%)    平均消耗词元      编译器     虚拟机    有效性 (%)   平均消耗词元
                   OpenJDK 17    5      4      82.38      1 298.7     3       3      59.54      3 447.1
                   OpenJDK 21    3      1      82.31      1 328.8     3       2      60.78      3 614.0
                     总计          8      5       -           -         6       5       -          -

                    然而, 在移除使用描述总结组件后, LumiX           在生成测试程序的有效性以及平均词元指标上效果较差. 例如,
                 OpenJDK 17  的实验中, w/o LumiXsum  在有效性指标上相较于完整的        LumiX  下降了  22.84%. 同时, w/o LumiXsum
                 生成单个测试程序需要消耗的平均词元显著增长. 例如, 在                 OpenJDK  的实验中, w/o LumiXsum  在平均词元指标上
                 相较于   LumiX  增加了  165.4%. 这表明, 过长且未经提炼的新特性使用描述可能导致大模型难以聚焦于核心要点,
                 从而影响生成测试程序的质量; 同时, 冗长的输入也显著增加了测试生成过程中的计算成本和资源消耗. 总的说
   23   24   25   26   27   28   29   30   31   32   33