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”). 因此, 在构建源码摘要时, 我们移除了
这些测试函数, 以避免引入不必要的干扰.

