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

2826                                                       软件学报  2026  年第  37  卷第  7  期


                 局限性. (1) 阈值设定对检测性能的影响. 在软件库粒度的复用检测场景中, 阈值的选取直接影响精确率与召回率
                 之间的权衡. 较为严格的阈值设置有助于提升检测结果的准确性, 但可能导致部分复用实例漏检, 从而降低召回
                 率. 鉴于本文聚焦于软件库粒度的复用分析, 未采用较低阈值以避免引入过多误报. 未来工作中, 可根据实际应用
                 需求, 灵活调整阈值组合, 以实现精确率与召回率的平衡. (2) 模块划分的模糊性问题. 当前版本的                         CAnalyzer 采用
                 经验性规则对模块进行划分, 在大多数情况下能够取得合理结果, 但对于部分结构复杂或交叉复用的代码文件, 可
                 能出现划分边界不清的问题, 进而影响依赖关系的识别精度. 后续工作将探索更精细的模块划分方法, 例如基于函
                 数调用图的分析手段, 以提升成分划分的准确性, 降低由划分误差引起的干扰. (3) 依赖关系检测的局限性. CAnalyzer
                 当前通过扫描“#include”“extern”等语句及标识符匹配方式进行依赖关系识别, 能够有效覆盖大部分源码级依赖.
                 然而, 该方法无法识别运行时可能触发的动态依赖; 同时, 在具有相同标识符名称的模块之间, 基于字符串的匹配
                 机制可能引入误报. 为提升依赖分析的准确性, 后续研究将考虑引入控制流图或函数调用图等更具语义信息的分
                 析手段.
                    ● 有效性威胁. 本研究在评估        CAnalyzer 的过程中仍面临以下潜在有效性威胁: 首先, 为了验证               CAnalyzer 的
                 准确性, 我们对数据集中项目的复用情况进行了人工核查. 然而, 由于部分项目缺乏正式的软件物料清单 (software
                 bill of materials, SBOM), 且无法获得完整的开源依赖库列表, 可能存在未纳入标准集的真实复用实例. 这类隐性复
                 用的遗漏可能导致       CAnalyzer 及对比工具的精确率评估出现偏差. 其次, 我们将             CAnalyzer 与  CENTRIS、TPLite
                 和  OSSFP  这  3  种代表性工具进行对比分析, 旨在评估在多源托管仓库构建的                 C/C++ TPL  特征库场景下, 舍弃函
                 数诞生时间、结合特征库预处理与多重阈值策略的方法, 在软件库粒度复用检测中的有效性表现. 需要指出的是,
                 本研究并不否定上述工具的整体性能, 而是希望通过对比说明                    CAnalyzer 在特定检测场景下具备更优的检测效果.

                  6   相关工作

                  6.1   软件成分分析
                    软件成分分析 (SCA) 技术用于识别开源软件及商业软件中涉及的源代码、模块和框架等组成成分, 分析其构
                 成与依赖关系, 并检测是否存在已知的安全漏洞和潜在的许可证合规问题, 确保软件供应链中组件的安全. 随着现
                 代软件开发对第三方库依赖程度的不断提升, SCA               在软件开发生命周期中发挥着日益关键的作用.
                    根据软件成分分析的输入形式和分析目标的不同, SCA                 技术可分为源到源 (source-to-source, S2S) 分析和二进
                 制到源 (binary-to-source, B2S) 分析两类. B2S  分析指从已编译的二进制文件中识别其使用的外部组件, 主要应用
                                                                      [5]
                 于逆向工程、安全审计和漏洞分析等场景. 典型工具包括                   OSSPolice 、BinPro [42] 、BinaryAI [43] 等. 相比之下, S2S
                 分析通过直接解析源代码, 识别项目中的依赖关系、导入的库文件和头文件等, 从而识别引用的外部组件和第三
                 方库, 广泛应用于开源治理、许可证合规检测等领域. 本研究聚焦于                    C/C++语言项目的     S2S  成分分析方法, 旨在提
                 升软件组件的可见性和可管理性. 因此, 本文将重点回顾与                 S2S  相关的研究工作.
                    近年来, 针对不同应用场景, S2S        领域发展出多种      SCA  工具. 部分商业工具, 如    OWASP  [44] 和  Sonatype [45] 依赖
                 SBOM  识别项目中使用的第三方库, 但由于开源            C/C++代码库普遍缺乏标准化的          SBOM  文件, 这类工具在源代码
                 检测中的适用性有限. 另一些工具侧重于识别代码中易受攻击的脆弱部分                        [4,46−53] , 如漏洞函数匹配等方法, 虽能有
                 效定位潜在漏洞, 但仅针对特定易受攻击的              TPL, 无法提供完整的成分分析, 覆盖范围有限. 此外, 基于代码克隆检
                                    [9]
                 测的工具 (如   BlackDuck ) 通过对比目标代码与       TPL  函数的相似性判断是否存在复用. 然而, 并非所有函数都具
                 有唯一性, 一些公共函数可能被多个            TPL  共享, 易导致复用分析中的误判, 引发假阳性. 为提升             SCA  技术的准确
                 性, 亟需在特征库构建阶段提取具有唯一性判别能力的                 TPL  特征, 以降低公共函数干扰.
                    为解决公共函数干扰问题, CENTRIS         [13] 基于“被复用的  TPL  通常具有较早函数诞生时间”的假设, 通过分析函
                 数的诞生时间推导       TPL  间的依赖关系, 以区分外部引入函数与自身函数, 并剔除冗余外部函数. TPLite                 [14] 在此基础
                 上引入基于    PageRank  算法  [35] 的中心性过滤器, 用于识别并过滤无效依赖, 从而弥补函数诞生时间方法的局限.
                 OSSFP [15] 将  TPL  函数划分为克隆函数、支持函数、通用函数和核心函数, 并通过设定阈值和函数诞生时间过滤
   136   137   138   139   140   141   142   143   144   145   146