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

3082                                                       软件学报  2025  年第  36  卷第  7  期


                    该算法接受依赖树       DT  和调用图   CG  作为输入, 并输出使用但未声明的依赖库集合              JS. 算法的工作流程如下:
                 首先, 初始化未声明依赖库集合          JS (第  1  行). 接着, 创建一个集合  directDeps 用于存储直接依赖库     (第  2  行). 然后,
                 算法遍历依赖树      DT  中深度为  1  的依赖库   dep (第  3  行), 并将这些直接依赖库添加到集合       directDeps 中  (第  4  行).
                 完成依赖树的遍历后, 算法接着遍历调用图              CG  中直接调用的依赖库      dep (第  6  行). 对于每一个调用的依赖库     dep,
                 如果该依赖库不在集合        directDeps 中, 算法将其添加到未声明依赖库集合           JS  中  (第  7–9  行). 最后, 算法结束对调
                 用图的遍历    (第  10  行), 并完成未声明依赖的检测.
                    4) 类别  1.4  未声明依赖 (如算法   A4  所示)


                 算法 A4. 未声明依赖检测.
                 输入: DT: 依赖树; CG: 调用图;
                 输出: JS: 使用但未声明的依赖库集合.

                 1.   JS ⇐ {}
                 2.   directDeps⇐ {}
                 3.   for dep ∈ DT and dep.depth = 1 do
                 4.    directDeps.add(dep)
                 5.   end for
                 6.   for dep ∈ CG.directCalledDeps do
                 7.    if not dep ∈ directDeps then
                 8.     JS.add(dep)
                 9.    end if
                 10. end for

                    该算法接受依赖树       DT  和调用图   CG  作为输入, 并输出未使用的依赖库集合            JS. 算法的工作流程如下: 首先,
                 初始化未使用依赖库集合         JS (第  1  行). 接着, 创建一个集合  directDeps 用于存储直接依赖库     (第  2  行). 然后, 算法
                 遍历依赖树    DT  中深度为   1  的依赖库  dep (第  3  行). 对于每一个直接依赖库    dep, 算法检查该依赖库是否不在调用
                 图  CG  的调用依赖集合    CG.calledDeps 中  (第  4 行). 如果该依赖库未被调用, 则将其添加到直接依赖库集合          directDeps
                 中  (第  5  行). 最后, 算法结束对依赖树的遍历     (第  7  行), 并完成未使用依赖的检测.
                    5) 类别  1.5  未使用依赖 (如算法   A5  所示)

                 算法 A5. 未使用依赖检测.

                 输入: DT: 依赖树; CG: 调用图;
                 输出: JS: 使用但未声明的依赖库集合.
                 1. JS ⇐ {}
                 2. directDeps ⇐ {}
                 3. for dep ∈ DT and dep.depth = 1 do
                 4.  if not dep ∈ CG.calledDeps then
                 5.   directDeps.add(dep)
                 6.  end if
                 7. end for

                    该算法接受依赖树       DT  和调用图   CG  作为输入, 并输出未使用的依赖库集合            JS. 算法的工作流程如下: 首先,
   156   157   158   159   160   161   162   163   164   165   166