Page 136 - 《软件学报》2026年第7期
P. 136
徐美秋 等: CAnalyzer: 面向 C/C++源代码的软件成分分析技术 2821
以评估其在实际应用中的可靠性和效果.
TP
(5) 召回率 (Recall): Recall = , 该指标评估 CAnalyzer 全面检测 TPL 成分及其依赖关系的能力.
TP+FN
4.3 参数设置分析实验
为了探究 RQ1, 我们通过调整 α (公式 (4))、β (公式 (5)) 和 θ (公式 (6)) 这 3 个关键参数的不同组合, 评估其
对检测结果的影响. α、β 和 θ 分别表示从函数、文件及库维度判断软件复用的阈值 (见第 3.2 节). CAnalyzer 将 α
设置为 0.1, 假设当两个项目之间的函数重合度超过 10% 时, 可能发生软件复用. α 采用固定值主要基于以下考虑:
α 的作用在于过滤掉零散的偶然函数匹配, 10% 已被既有研究证明是合理的经验阈值 [13,14] . CAnalyzer 研究重点在
于探索文件级 β 与库级 θ 阈值组合对检测结果的影响而非重复已有研究对 α 的参数敏感性进行验证. 因此, 为避
免引入额外变量, CAnalyzer 保持 α 不变专注于 β 与 θ 的参数设置实验.
为了全面评估参数的影响, 我们首先从标准集中的 200 个项目中随机抽取 100 个项目进行参数设置分析实验
(涵盖 314 个组件), 其余 100 个项目则用于有效性对比实验. 这样的划分的目的: (1) 避免数据泄漏. 通过将数据集
一分为二, 确保参数调优过程中使用的数据不会与有效性评估的数据重叠, 从而保证实验结果的独立性与可靠性;
(2) 提高泛化性. 在一个子集上探索合理的阈值区间, 在另一独立子集上验证工具的性能, 可以更好地评估所选参
数在不同项目上的适应性. 在随机划分这 200 个项目时, 我们采用分层抽样策略, 确保两个来源在参数实验集和效
果验证集中的分布比例保持一致, 避免因来源差异导致的偏向性. 最终, 参数实验结果显示: 这些项目平均复用
TPL 79% 的文件, 且这些文件中有 80% 的函数被复用. 基于该统计分布, 我们将 β 与 θ 的取值范围设定为 [0.5,
0.6, 0.7, 0.8, 0.9, 1]. 如图 9 所示, 不同的 β 和 θ 组合对精确率 (Precision) 和召回率 (Recall) 有显著影响. 随着 β 和
θ 值的增加, 精确率通常提高 (因为更严格的阈值减少了假阳性), 但召回率下降 (因为一些真实的 TPLs 未达到阈
值). 这表明 β 和 θ 在精确率与召回率之间存在反向作用.
0.98
0.85
0.96
0.94 0.80
0.92 0.75
β β
0.90
0.70
0.88
0.65
0.86
0.60
0.84
θ θ
(a) Precision (b) Recall
图 9 不同 β 和 θ 组合精确率和召回率分布
● 实验结论 (RQ1). CAnalyzer 的主要参数 (α、β 和 θ) 对其检测 TPLs 的能力具有显著影响. β 和 θ 在精确率
与召回率之间存在反向关系. 为了平衡精确率和召回率, 我们使用调和平均值 F1 分数 [34] 作为综合评价指标. 计算
结果表明, 当 β=0.7 且 θ=0.6 时, F1 分数达到最高值 0.88, 表明该参数组合在精确率和召回率之间取得最佳平衡.
4.4 有效性对比实验
本节实验旨在回答 RQ2, 我们将 CAnalyzer 与 CENTRIS [13] 、TPLite [14] 、OSSFP [15] 在标准集上进行比较. 剔除
第 4.3 节中用于统计阈值的项目后, 我们使用这些工具对剩余的 100 个项目进行检测, 并分析实验结果, 探讨假阳
性和假阴性出现的原因.
● 与 CENTRIS 比较. 鉴于 CENTRIS 已发布特征库和源代码, 我们直接在其特征库的基础上对 100 个项目进
行了检测. CENTRIS 通过函数诞生时间来判定公共函数归属, 认为诞生时间较早的库更可能是公共函数的“发源
地”. 因此, 特征库构建时, 晚诞生库中的公共函数被视为非关键特征并剔除. 当目标代码与 TPL 相同的函数占比
达到 10% 时, 认为该 TPL 是目标代码的有效成分.

