Page 128 - 《软件学报》2026年第7期
P. 128
徐美秋 等: CAnalyzer: 面向 C/C++源代码的软件成分分析技术 2813
入了潜在的安全漏洞, 威胁到软件的整体质量和稳定性. 通过跟踪 TPL 间的依赖关系, 可以揭示安全漏洞在软件
项目中的传播途径, 有助于安全团队根据风险的严重程度优先处理漏洞, 确保最关键的资源得到及时有效保护.
● 许可证合规性审查的准确性分析. 由于 TPL 发布于多样化的许可证之下 (如 BSD、MIT、GPL 等), 其使用
受到相应版权法及许可条款的严格约束, 这些条款要求开发人员必须严格遵守, 以确保项目的合法性与合规性. 然
而, 由于无法追踪 TPL 间的依赖关系, 合规性审查往往仅限于项目自身及直接引用的 TPL 之间的许可证是否冲
突, 而无法审查整个项目在组合使用多个 TPL 时的整体合规性.
例如, 某些许可证可能强制要求公开源代码, 但在缺乏依赖关系清晰图的情况下, 开发人员难以精确界定哪些
代码片段需遵循此要求, 进而可能无意中违反许可协议, 引发法律争议. 历史上, 未能充分遵守 TPL 许可证的合规
性要求, 诸如 Cisco 与 VMWare 因未遵守 Linux 内核的开源许可条款而陷入法律困境的案例屡见不鲜 [5,27,28] .
尽管某些包管理工具可以提供 TPL 之间的原生依赖关系, 但一旦 TPL 被引入目标代码中, 它便成为项目的一
部分, 依赖关系应基于目标代码的实际情况分析, 而不只依赖原生关系. 目标代码中的 TPL 往往经过修改和整合,
原有的结构可能发生变化. 例如, 原本属于同一文件的函数可能被分散到多个文件中, 或者一个文件内可能包含来
自多个 TPL 的函数, 这种结构变化使得在目标代码中准确划分 TPL 边界和分析依赖关系变得更加复杂.
挑战 2. 现有 SCA 工具缺乏对目标代码中 TPL 间依赖关系的分析, 限制了软件安全漏洞和许可证合规性审查
的全面性. 此外, 由于代码结构的变化, 分析融入目标代码中的 TPL 依赖关系变得复杂, 难以准确划分 TPL 边界并
追踪其依赖关系.
3 CAnalyzer 方法
为解决以上挑战, 我们提出了 CAnalyzer, 一种基于 S2S 的 SCA 技术, 用于分析 C/C++语言软件源代码中复用
的 C/C++ TPL, 并深入分析这些 C/C++ TPL 之间的依赖关系, 为安全漏洞检测和许可证合规性审查提供准确的成
分识别结果与依赖信息支撑. 图 3 展示了 CAnalyzer 的整体实现框架.
步骤2: 识别目标代码中的TPL成分 步骤3: TPL间依赖分析
OUTPUT
特征提取 组件识别 模块划分 特征提取 依赖检测
引入文件粒 依赖特征同
提取函数 度及重阈 根据目录 提取全局 include等关
INPUT 结构及元 变量和 .h
并哈希 值判断TPL 键语句信息
存在性 数据划分 路径信息 匹配
TPL A
步骤1: 构建TPL特征库
目标代码 特征库 TPL B TPL C
收集源码 特征提取
预处理
TPL D
数据源 TPL特征库
图 3 CAnalyzer 整体实现框架图
CAnalyzer 依托于一个大规模的高质量的 C/C++ TPL 特征库的支持, 覆盖了 15 个主流托管仓库中的 C/C++
TPL, 包含来自 33 100 个 C/C++ TPL 中的 30 047 290 个函数特征. 为解决普遍存在的公共函数和不准确的函数诞
生时间对 SCA 检测结果造成的干扰 (引言中挑战 (1)), CAnalyzer 结合文件路径语义和相似 TPL“家族”来识别函
数所属的原始 TPL, 进而减少公共函数造成误报 (步骤 1).
此外, 为了更精准地判断目标代码对 TPL 的复用 (引言中挑战 (2)), CAnalyzer 选取细粒度特征 (函数粒度) 执
行相似性计算, 并结合多级复用阈值: 函数级→文件级→TPL 级, 来确定 TPL 是否被复用 (步骤 2).
最后, 为了全面而准确地分析这些被复用 TPL 之间的依赖关系 (引言中挑战 (3)), CAnalyzer 首先将目标代码

