Page 138 - 《软件学报》2026年第7期
P. 138

徐美秋 等: CAnalyzer: 面向  C/C++源代码的软件成分分析技术                                         2823


                    (1) 目标代码复用公共函数导致误报和漏报. 目标代码仅复用了家族内的公共函数, 而未包含任何标志函数.
                 在特征库预处理中, 这些公共函数被划归到家族内                DI 值较低的   TPL, 目标代码更容易匹配到该         TPL, 导致假阳性.
                 同时, 这些函数从真实      TPL  中被剔除, 无法正确识别真实复用组件, 导致假阴性. 例如, 在               OpenCC [36] 案例中, 它复
                 用了  pybind11 [37] 的部分代码, 而这些代码由于其广泛性被算法视为家族内              DI 值较低的   hera [38] 的标志函数, 并从
                 pybind11  中剔除. 最终, 目标代码匹配过程中产生了假阳性 (匹配            hera) 和假阴性  (未匹配  pybind11).
                    (2) 混合语言软件干扰. 收集      TPL  时, 由于未能区分纯     C/C++软件与混合语言软件, 特征库中可能包含混合语
                 言项目的   C/C++部分. 在特征匹配过程中, 这些混合语言软件的              C/C++部分与目标代码的特征相似, 从而引发假阳
                 性结果. r-cran-fs [39]  (一个混合了  C  与  R  语言的软件) 在与  hermes [40] 的对比中就出现了这样的假阳性情况.
                    由于  CAnalyzer 的误报主要集中于      TPL  家族内部的公共函数匹配, 即不同衍生库或复用库之间共享的通用函
                 数实现. 从工程实践角度分析, 这类误报通常不会引发严重的安全或合规性判断错误, 原因是: (1) 被误判的库往往
                 与真实复用库处于同一功能家族, 其许可证、依赖关系和安全风险往往高度一致; (2) 误报位置多为算法或工具性
                 函数 (如字符串处理、数学运算等), 在工程层面并不影响后续的依赖追踪、漏洞定位或许可证分析结论. 因此, 这
                 类误报更多影响检测报告的精度指标, 而非决策结论的可靠性.
                    ● 假阴性 (FN) 分析. 所有的假阴性案例均源于           CAnalyzer 静态阈值的影响. CAnalyzer 引入了文件粒度和更
                 为严苛的多重阈值标准来判定           TPL  的存在性. 虽然这一标准能有效减少误报, 但同时也可能忽略一些相似度较低
                 但仍存在复用关系的       TPL, 导致假阴性.
                    ● 实验结论 (RQ2). CAnalyzer 的精确率和召回率分别为         90.63%  和  86.57%. 通过引入文件粒度分析和严格的
                 多重阈值标准来判定        TPL  的存在性, CAnalyzer 有效减少了假阳性. 此外, CAnalyzer 拥有更全面的          TPL  特征库,
                 提升了查全能力. 与      CENTRIS、TPLite 和  OSSFP  相比, 在精确率和召回率上表现更优.
                  4.5   消融实验
                    为了验证    RQ3, 我们设计了消融实验, 结合不同的特征库处理方式和               TPL  识别方法, 应用于    100 个项目, 分析这
                 些改进对成分识别能力的影响. 我们将影响              SCA  准确性的因素分为两类: 特征库质量和           TPL  识别方法. 我们设置
                 了经过   3 种处理方式的特征库: 无预处理 (DataBase)、第       1 阶段预处理 (DataBase-I) 和第  2 阶段预处理 (DataBase-II).
                 在  TPL  识别方法上, 分别采用单阈值 (Detection, 使用    α) 和多重阈值 (Detection-I, 使用  α、β、θ). 通过这  6  种组合
                 实验, 分析不同设置对检测精确率的影响.
                    ● 特征库质量的影响分析. 未经过预处理的特征库精确率较低 (16.66%–50.00%, 见表                   5), 主要原因在于其包
                 含大量公共函数 (38%), 这导致复用真实组件代码的库被误报, 如图                  1  所示, 从而增加了假阳性. 如图       10  所示, 特
                 征库经过每个处理阶段后, 精确率显著提升. 这表明, 每个阶段都有效地为公共函数找到合理归属, 剔除了                               TPL  中
                 非自身的函数, 降低了公共函数在特征库中的比例 (见表                 6), 从而减少了其对    SCA  结果准确性的干扰.


                                                                 1.0
                                                                 0.8

                        表 5 不同影响因素组合下实验结果 (%)

                    序号   特征库类型      TPL识别方法    精确率    召回率        Values  0.6
                     1    DataBase   Detection  16.66  96.29
                     2    DataBase   Detection-I  50.00  92.62   0.4
                     3    DataBase-I  Detection  27.12  92.59
                     4    DataBase-I  Detection-I  65.00  89.89  0.2
                     5   DataBase-II  Detection  37.08  90.74
                                                                  DataBase       DataBase-I     DataBase-II
                     6   DataBase-II  Detection-I  90.63  86.57
                                                                                 Conditions
                  注: DataBase: 没有经过任何预处理的特征库; DataBase-I: 经过
                                                                          Precision Detection  Precision Detection-I
                  第1阶段预处理的特征库; DataBase-II: 经过第2阶段预处理的
                                                                          Recall Detection  Recall Detection-I
                  特征库; Detection: 未使用多重阈值的TPL检测逻辑; Detection-I:
                  使用多重阈值的TPL检测逻辑                                 图 10    不同特征库条件下精确率和召回率趋势
   133   134   135   136   137   138   139   140   141   142   143