Page 158 - 《软件学报》2025年第7期
P. 158

孙伟杰 等: Java 依赖异味的实证研究与统一检测技术                                                    3079


                 版本及其中新引入的        java-library  特性, 但本地仅存在  Gradle 3.1  版本而无法进行构建. 在使用构建工具启动器时,
                 由于项目中仅存在启动器脚本           (gradlew), 而缺少启动器  JAR (gradle-wrapper.jar), 因此无法找到  gradle-wrapper.jar
                 而导致构建错误.

                                         (a) 危害 1
                                                Gradle 配置                 构建错误
                                                           gradle-wrapper.properties
                                            项目 pr
                                                            由于缺少配置信息, 只得使用本地
                                          项目中使用了 Gradlev4.1 版本  的 Gradle v3.1, 无法获取对应特性
                                           后加入的特性 “java-library”
                                            图 A12 异味   2.1  可能危害与对应触发场景


                                    (a) 危害 1
                                        试图利用 Gradle 封装器
                                        脚本启动 v4.1 版本    调用 wrapper.jar         构建错误
                                                                   gradle-wrapper.jar
                                     项目 pr    Gradle 封装器脚本 gradlew
                                      项目中使用了 Gradlev4.1  本地 Gradle 版本 v3.1
                                    版本后加入的特性 “java-library”

                                            图 A13 异味   2.2  可能危害与对应触发场景

                    11) 类别  2.3  构建工具启动器   JAR  异常
                    构建工具启动器       JAR  异常可能造成构建时间增加和构建工具使用时的安全隐患, 以下将详细阐述这些危害
                 的具体触发场景.
                    (1) 构建时间增加: 其触发场景为项目构建工具启动器 JAR 版本过旧, 导致性能问题. 以图                      A14(a) 为例, 项目
                 使用的是 Gradle 3.0 版本, 对应的 gradle-wrapper.jar 应该是 3.0 版本, 预期的校验和为    42d7a2, 但实际的校验和为
                 695 089, 对应于 2.6 版本. 然而, Gradle 2.6 版本存在严重的性能下降问题, 影响了 Gradle 包装器的启动时间, 进而
                 导致构建时间增加, 而在 3.0 版本中此问题已被修复.


                                (a) 危害 2
                                     利用 Gradle 封装器
                                     脚本启动 v3.0 版本  调用 wrapper jar
                                                             gradle-wrapper.jar
                                                                                 构建成本增加
                                  项目 pr   Gradle 封装器脚本 gradlew  冲突
                                      文件的实际校验和 695089 与 v2.6 版本对应校验和吻合  v3.0 版本的预期校验和是 42d7a2
                                          但 v2.6 版本有严重性能问题,
                                          v3.0 版本中此问题被修复
                                (b) 危害 10
                                                                                   安全隐患
                                      利用 Gradle 封装器  调用 wrapper jar  试图执行危险代码
                                      脚本启动 v3.0 版本
                                  项目 pr    Gradle 封装器脚本 gradlew 篡改的 gradle-wrapper.jar
                                            图 A14 异味   2.3  可能危害与对应触发场景

                    (2) 安全隐患: 其触发场景为项目构建工具启动器 JAR 被篡改. 以图                A14(b) 为例, 项目中的 gradle-wrapper.jar
                 校验和与任何官方发布的已知版本都不相符. 其被修改并添加了恶意代码, 当开发者试图通过构建工具启动器启
                 动构建工具时, 可能会导致安全隐患, 例如开发者的信息被窃取等.
                    12) 类别  2.4  模块间库重复
                    模块间库重复可能会造成项目维护成本的增加, 其触发场景如下.
                    (1) 依赖库维护难度增加: 其触发场景为项目对未集中管理的依赖库进行版本升级. 以图                          A15(a) 为例, 项目中
                 的模块   mod1 和  mod2  之间存在同一依赖库     lib  的  1.0.0  版本, 但其版本分别在各自配置文件中进行声明, 而并未进
                 行统一指定. 在试图将      lib  升级至  2.0.0  版本时, 需要将修改同步至所有模块, 这就导致项目维护成本的增加.
   153   154   155   156   157   158   159   160   161   162   163