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 不同特征库条件下精确率和召回率趋势

