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  个方面的
   135   136   137   138   139   140   141   142   143   144   145