Page 137 - 《软件学报》2025年第7期
P. 137
3058 软件学报 2025 年第 36 卷第 7 期
表 10 Maven 项目检测结果 (续)
不在基准集中的检出数 (占比 (%))
异味类别 基准集 检测结果集 基准集中的检出数 (召回率 (%))
人工验证为真的检出数 人工验证为假的检出数
1.8 0 0 0 0 0
2.1 0 0 0 0 0
2.2 0 0 0 0 0
2.3 0 0 0 0 0
2.4 36 58 36 (100) 22 (100) 0
2.5 0 0 0 0 0
合计 125 192 120 (96) 63 (87.5) 9 (12.5)
表 11 Gradle 项目检测结果
不在基准集中的检出数 (占比 (%))
异味类别 基准集 检测结果集 基准集中的检出数 (召回率 (%))
人工验证为真的检出数 人工验证为假的检出数
1.1 1 1 1 0 0
1.2 0 0 0 0 0
1.3 3 20 3 (100) 17 (100) 0
1.4 0 0 0 0 0
1.5 0 0 0 0 0
1.6 6 7 5 (71.4) 2 (100) 0
1.7 0 0 0 0 0
1.8 6 6 6 (100) 0 0
2.1 4 4 4 (100) 0 0
2.2 2 2 2 (100) 0 0
2.3 0 0 0 0 0
2.4 0 0 0 0 0
2.5 0 0 0 0 0
合计 22 40 21 (95.4) 19 (100) 0
● 假阴分析. 我们进一步分析基准集中未被检出的异味实例 (假阴), 发现它们都属于异味 1.6 依赖范围误用.
未被检出的主要原因是项目中存在其他未解决的异味问题, 导致 JDepAna 错误地将对应的异味认定为其他类型
的异味, 从而导致假阴. 举例来说, #INLONG-4771 [49] 中的模块 inlong-manager/manager-plugins, 其依赖库 org.junit.
jupiter:junit-jupiter 出现了异味 1.6 依赖范围误用, 预期范围应为 test, 但实际范围为 compile. 然而, 该模块中还存
在与 junit-jupiter 相关的异味 1.4 未声明依赖和 1.5 未使用依赖的特征. 因此, JDepAna 会优先检测依赖库
org.junit.jupiter:junit-jupiter 是否出现异味 1.5, 但在解决了异味 1.4 和 1.5 之后, JDepAna 可以正常检出异味 1.6.
● 假阳分析. 我们进一步分析了不在基准集中但在检测结果集的实例. 在 Maven 中, 这类实例共计 72 个, 其
中 9 个 (12.5%) 经人工验证为假; 而在 Gradle 中, 这类实例共 19 个, 经人工验证均为真. 对于被验证为真的实例,
它们是在提出问题报告时仍然存在但尚未被发现的问题, 但由于问题报告对应的项目版本与项目当前版本有较大
的差异, 我们没有寻求开发者的反馈, 开发者反馈会在 RQ4 中讨论. 而对于被验证为假的 9 个实例 (假阳), 我们发
现它们都属于异味 1.5. 主要原因在于异味 1.5 的检测对项目调用图的精度要求较高. 如果项目中大量使用诸如反
射和动态特性等功能, 静态分析的缺陷可能导致调用图与实际不一致, 从而使得误报更容易发生. 以项目 Hapi-
Fhir-Jpaserver-Starter [50] 为例, 7 个假阳实例均出现在此项目中. 主要是因为项目使用了 Spring 框架 [51] , 而 Spring 框
架大量使用 Java 的反射和动态类加载等特性, 导致静态分析无法准确分析.
基于以上发现, 我们回答研究问题 RQ3 如下: 在我们收集的包含 147 个依赖异味实例的基准集中, JDepAna
达到了 95.9% 的召回率和 96.1% 的精确率, 在确保高精确度的同时保持了较高的召回率, 有效识别并报告了项目
中的依赖异味.

