Page 140 - 《软件学报》2026年第7期
P. 140
徐美秋 等: CAnalyzer: 面向 C/C++源代码的软件成分分析技术 2825
invalid”, 而 B 文件集中存在一个类 UserData. 工具会误判为 A 文件集间接依赖了 B 文件集中的 UserData 类, 原因
是 A 中的输出字符串包含了 B 中类名.
实际上, logInfo() 函数仅是将一个错误信息输出到日志中, 并没有真正使用 UserData 类. 尽管字符串中包含类
名, 但并不意味着这两个文件之间存在依赖关系. 这种浅层匹配方法在复杂的代码环境中容易产生误判, 特别是当
类名或对象名出现在日志输出、错误信息或字符串中时. 未来, 我们计划引入数据流图分析等更精确的方法, 以提
高依赖关系识别的准确性.
● 假阴性 (FN) 分析. 假阴性现象主要由工具在解析 BUILD.gn 文件中的动态定义路径或引用时的局限性引
起. 这些动态定义通常包括依赖变量的路径配置 (例如$root_path/some_file.cc), 或通过脚本生成的模块依赖列表
(例如 deps=[get_deps_from_script()]). 由于这些路径或引用的具体值需在构建时动态解析, 工具在静态分析阶段难
以获取完整信息, 从而导致文件集不完整, 进而无法建立文件集之间的依赖关系. 这些问题凸显了在 TPL 依赖检
测中准确划分 TPL 成分模块的重要性, 未来研究可以通过改进模块划分策略, 减少假阴性.
● 实验结论 (RQ4). CAnalyzer 能够准确检测文件集之间的依赖关系, 精确率为 94.79%, 召回率为 98.99%. 在
假设 TPL 模块划分准确的前提下, 每个 TPL 模块可视为一个独立的文件集, 因此 CAnalyzer 同样能够高效识别和
提取 TPL 之间的依赖关系.
4.7 效率对比实验
为了探究 RQ5, 我们评估 CAnalyzer 的效率, 与已有的 SCA 工具进行对比实验, 通过评估 SCA 技术两个执行
时间: (1) 特征提取时间, 指的是对目标源代码提取特征的效率; (2) TPL 检测时间, 指的是基于特征库进行成分识
别的效率. 由于源代码文件的大小与处理时间存在较强的相关性, 因此, 评估结果报告的是经过大小归一化处理的
每个源代码项目的平均执行时间. OSSFP 提供商业版工具, 没有提供特征提取和 TPL 检测的独立时间, 因此我们
对比其总时间.
如表 8 所示, 3 个工具 (CENTRIS、TPLite 和 CAnalyzer) 在特征提取阶段的执行时间相近, 分别为 67.99、
109.32、67.99 s. 这是因为它们均采用函数粒度作为特征提取的基本单元, 且使用了高效的源代码解析工具. 具体
而言, CENTRIS 和 CAnalyzer 基于 Ctags [30] 进行特征提取, 而 TPLite 则使用 Tree-sitter [41] , 两者均为主流且性能优
越的解析器. 在 TPL 检测阶段, 检测时间与特征库规模密切相关: 特征库越大, 匹配耗时越长. CAnalyzer 维护了一
个大规模的特征库, 涵盖来自 33 100 个 C/C++ TPL 的 30 047 290 条函数级特征, 远超 CENTRIS 所使用的特征库 (覆
盖 10 294 个 C/C++ TPL). TPLite 的检测耗时最长, 达到 3 107.68 s, 主要原因在于其采用基于图的特征匹配算法,
该方法在结构匹配精度上具有优势, 但计算复杂度远高于基于哈希的相似性匹配策略. 相比之下, 商用工具
OSSFP 具有最短的检测时间 (68.73 s), 其采用查询式检测方式替代了对特征库的逐一比对, 显著提高了处理效率.
然而, 这种方式也带来了精确率和召回率的下降, 在检测效果上存在明显局限性.
表 8 CAnalyzer 与相关工具执行效率对比实验结果 (s)
工具 特征提取时间 TPL检测时间 总时间
CENTRIS 67.99 23.99 91.98
TPLite 109.32 3 107.68 3 217.00
OSSFP - - 68.73
CAnalyzer 67.99 969.45 1 037.44
注: “-”表示无法获取相应数据. OSSFP仅提供在线检测服务, 无法获得其内部执行过程, 因此无法分
别统计特征提取时间和TPL检测时间
● 实验结论 (RQ5). CAnalyzer 在特征提取阶段表现最优, 耗时仅 67.99 s; 同时, 在基于大规模特征库 (包含
30 047 290 个函数特征) 执行 TPL 检测的条件下, 仍展现出具有竞争力的检测效率, 检测时间为 969.45 s.
5 讨 论
● 技术局限性. 尽管 CAnalyzer 在 C/C++ TPL 检测与依赖分析中取得了良好效果, 但仍存在以下 3 个方面的

