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. 算法的工作流程如下: 首先,

