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 首先将目标代码
   123   124   125   126   127   128   129   130   131   132   133