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

徐美秋 等: CAnalyzer: 面向  C/C++源代码的软件成分分析技术                                         2815


                               (a) TPL数据集构建                                      (b) TPL特征提取



                                                                                      InitialDatabase
                         初始化依赖项         depname  开源软件                           出现一个函数对应多个TPL情况
                        CCScanner扫描         索引库
                                                                      特征提取           TPL A      TPL B
                                                                                   Hash (function a): [version 1,...,
                                                                                    version k],[path 1,...,path k]  Hash (function a)
                                          depname
                                 依赖项名称                              提取函数、路         Hash (function b): [version 1,...,
                                                                                    version k],[path 1,...,path k]
                  TPL收集起始         depnames            下载源码          径等信息作为         Hash (function c): [version 1,...,  Hash (function c)
                                                                                    version k],[path 1,...,path k]
                    项目集                   GitHub, GitLab,             TPL特征        Hash (function d): [version 1,...,  Hash (function d)
                                                                                                  ...
                                                                                    version k],[path 1,...,path k]
                                             Gitee                                     ...
                                                                                  TPL C  TPL D   TPL E
                                                                                Hash (function a)  Hash (function a)  Hash (function a)
                                         扫描依赖项                                  Hash (function b)  Hash (function c)  Hash (function c)
                                                                                Hash (function c)  Hash (function d)  Hash (function d)
                                        CCScanner扫描                                ...     ...    ...
                            FamilyDatabase
                                                                         CleanDatabase

                                     TPL B
                          TPL A                                                              清理特征库
                        Hash (function a): [version 1,...,  Hash (function a)
                        version k],[path 1,...,path k]  家族化特征库          TPL A      TPL B
                       Hash (function b): [version 1,...,  Hash (function c)  Hash (function a): [version 1,...,
                        version k],[path 1,...,path k]                 version k],[path 1,...,path k]  Hash (function a)  依据目录结构、路
                        Hash (function c): [version 1,...,  Hash (function d)  Hash (function b): [version 1,...,
                        version k],[path 1,...,path k]  ...           version k],[path 1,...,path k]  Hash (function c)
                       Hash (function d): [version 1,...,  将有相同函数的    Hash (function c): [version 1,...,  径外部标识等清理
                        version k],[path 1,...,path k]  TPL归为一类       version k],[path 1,...,path k]  Hash (function d)  TPL冗余函数
                           ...       TPL C                            Hash (function d): [version 1,...,  ...
                                                                      version k],[path 1,...,path k]
                          TPL E     Hash (function a)                     ...
                         Hash (function a)  Hash (function b)
                         Hash (function c)  Hash (function c)        TPL C          TPL E
                         Hash (function d)  ...                    Hash (function a)  Hash (function a)
                                                                   Hash (function b)  Hash (function c)
                            ...
                                                                   Hash (function c)  Hash (function d)
                                                                      ...            ...
                            (c) TPL特征库家族化                                     (d) TPL特征库预处理
                                            图 4 C/C++ TPL  索引库和特征库构建流程


                                                                           Hash(function a): [version 1,...,version k],[path 1,..., path k]
                                                                                       ...
                                                                 源码摘要       Hash(function b): [version 1,...,version k],[path 1,..., path k]
                          version 1  function a  function b  function c                ...
                                                                           Hash(function c): [version 1,...,version k],[path 1,..., path n]
                             ...
                                                                            version 1: version 1_time
                  TPL
                          version k  function a  function b  TPL  版本信息           ...
                                                                            version n: version n_time
                             ...
                          version n  function c                   存储库      该TPL的所有文件路径, 用来衡量两个存储库目录结构
                                                                 目录结构        是否相同, 是否有归属同一个TPL成分的可能性
                                                                  存储库      该TPL的URL, 方便更新, 当上游软件发生更新时, 可以
                                                                   地址           通过Git命令得到最新修改的函数
                           (a) 非增量式存储                                   (b) 增量式存储
                                                图 5 C/C++ TPL  特征存储结构

                    为了确保    TPL  特征的代表性和准确性, 我们排除了源码中的测试函数. 测试函数通常用于验证功能、性能和
                 稳定性, 不直接参与核心功能实现, 且一般位于特定的测试目录 (如“./test”). 因此, 在构建源码摘要时, 我们移除了
                 这些测试函数, 以避免引入不必要的干扰.
   125   126   127   128   129   130   131   132   133   134   135