一种基于向量数据库的特征融合代码克隆检测方法及装置

文档序号:37144035发布日期:2024-02-26 16:56阅读:16来源:国知局
一种基于向量数据库的特征融合代码克隆检测方法及装置

本发明涉及代码克隆,具体来说,涉及一种基于向量数据库的特征融合代码克隆检测方法及装置。


背景技术:

1、代码克隆是指在软件系统中存在的相似或相同的代码片段。代码克隆的存在会给软件项目带来负面的影响:代码克隆会增加软件系统的维护成本,导致代码冗余,降低软件质量,增加缺陷和漏洞的风险。

2、因此,为了有效地管理和维护软件系统,需要对代码克隆进行检测、分析和重构。代码克隆检测是指识别出软件系统中存在的代码克隆,并将其分类为不同的类型。根据代码克隆的相似程度和变化方式,可以将其分为以下四种类型:

3、类型i:完全相同的代码片段,除空白、注释和格式等无关紧要的差异。

4、类型ii:结构上相似的代码片段,除类型i的差异外,还可能存在标识符、字面量、类型、布局和非功能性语句等语法差异。

5、类型iii:在类型ii的基础上,还存在语句增加、删除或修改等差异。

6、类型iv:功能上相似或等价的代码片段,但语法和语义上有较大的差异。

7、目前,常用的代码相似性检测方法主要有以下几种:基于文本、基于词法、基于语法、基于指标和基于语义等方法。如公开号为cn115587358a的中国专利文献公开了一种二进制代码相似性检测方法,包括:获取二进制固件文件的函数的控制流程图;提取语义信息得到控制流程图的代码块嵌入向量;通过对代码块嵌入向量获取控制流程图的深度语义特征,以及确定代码块嵌入向量的顺序感知特征;融合深度语义特征和顺序感知特征,得到图嵌入向量;通过图嵌入向量计算函数相似度。

8、然而,单一的检测方法并不能较好地获取并检测所有类型和场景的代码克隆。

9、一方面,不同类型的代码克隆需要不同程度的抽象和精确度。例如,类型i和类型ii的代码克隆可以通过基于文本或词法的方法进行有效地检测,而类型iii和类型iv的代码克隆则需要通过基于语法或语义的方法进行更深入地分析。

10、另一方面,不同场景的代码克隆需要不同程度的效率和可扩展性。例如,在大规模数据库中检测代码克隆时(比如亿级别的代码克隆检测),如果与数据库中的每一个代码片段都进行一一比较,则会造成费时费力。因此,需要采用其他的方案来更快更好地进行快速筛选。


技术实现思路

1、本发明提供了一种基于向量数据库的特征融合代码克隆检测方法及装置,可以实现在海量数据(亿级别及以上)的情况下快速筛选出一批最为相似的代码克隆结果,既能保证检测速度,又能保证细粒度情况下检测结果的准确性。

2、一种基于向量数据库的特征融合代码克隆检测方法,其特征在于,包括以下步骤:

3、(1)指纹库代码预处理阶段,对代码文件进行函数提取、预处理;

4、(2)指纹库代码词法指纹生成阶段,对每一个函数进行词法分析,计算得到每个函数的词法指纹,并在本地保存词法分析结果文件;

5、(3)指纹库代码语法及特征指纹生成阶段,对每一个函数进行语法提取和特征提取工作,输出语法及特征指纹;

6、(4)指纹库代码入库阶段,将步骤(2)得到的词法指纹与步骤(3)得到的语法及特征指纹进行融合,得到二进制代码指纹,据此建立索引并按照代码长度进行分区录入向量数据库;

7、(5)指纹粗粒度筛选阶段,将待检测的代码通过步骤(1)~(3)阶段相同的方法进行处理,提取待检测函数并生成对应的二进制代码指纹值,通过向量数据库按规则选择多个分区进行搜索,得到最相似的前n个结果;

8、(6)指纹细粒度筛选阶段,将步骤(5)得到的n个结果按照海明距离进行筛选,排除阈值高于人工预设的结果,得到筛选后的候选相似集合;随后将候选相似集合中的每一个候选函数读取本地词法分析文件,通过细粒度词法计算候选函数与待检测函数的细粒度相似度;

9、(7)反推文件、项目相似度计算阶段,将步骤(6)得到的函数相似度进行统计,得到文件级别的相似情况,然后按照文件级别的相似情况统计得到项目级别的相似情况。

10、本发明能够实现在函数级别上进行代码克隆检测,通过将函数代码的词法、语法和指标特征进行融合,实现对函数的代码指纹生成。并采用向量数据库的方法,能够实现高效高性能存储以及根据指纹索引快速查找最为相似的代码函数而无需和海量数据一一匹配,实现了在海量数据(亿级别及以上)的情况下快速筛选出一批最为相似的代码克隆结果。随后通过代码指纹的阈值设定做进一步筛选,根据筛选之后的少量候选相似代码函数做一一相似度细粒度计算,将满足要求的代码函数作为最终的查找结果。最后,根据函数级别的检测结果,分别反向推导出基于文件级别和项目级别的代码相似结果。

11、进一步地,步骤(1)的具体过程为:

12、(1-1)函数提取,遍历项目里面每一个代码文件,通过代码解析包将每个代码文件解析成抽象语法树ast,并找到每个函数的抽象语法树节点入口;

13、(1-2)预处理,将每个函数中的注释、制表符、空格和空行等与指纹和代码影响无关的节点进行过滤,替换函数的函数名、入参、函数调用和标识符。

14、步骤(2)的具体过程为:

15、(2-1)词法统计,首先生成一个所有位数均为0的词法指纹,随后对步骤(1)预处理后函数所包含的词法token进行统计,统计出指纹的词法中一共多少不同的token文本及出现次数;

16、(2-2)simhash计算,将每个不同的token文本通过哈希算法计算得到二进制指纹,将得到的指纹每个数字为1的位作为正权重,词法指纹的每个对应位上累加该token出现的次数;每个数字为0的位作为负权重,词法指纹的每个对应位上减去该token出现的次数,依次直至计算完所有不同的token文本,随后将词法指纹大于0的位置为1,其余置为0,得到最终的二进制词法指纹。

17、步骤(3)的具体过程为:

18、(3-1)生成节点组合,统计每个非叶子结点的语法信息以及以该节点作为子树得到的特征统计向量,特征统计用于统计该子数树包含的所有非根节点的不同语法信息的计数,形成一个多维的特征向量,并将该节点的语法信息和其特征向量拼接起来作为节点组合;

19、(3-2)simhash计算,将每个节点组合进行统计,计算出一共有多少个不同的节点组合文本以及其出现次数,按照步骤(2-2)的方法对每个组合进行哈希计算并最终得到二进制语法及特征指纹。

20、步骤(4)中,将词法指纹和语法及特征指纹直接拼接得到的二进制代码指纹,并根据函数的代码行数划分出多个分区并计算该函数对应的分区,将二进制代码指纹插入向量数据库的对应分区中。

21、步骤(5)中,将待检测的代码在步骤(1)~(3)的计算和拼接后得到二进制代码指纹,根据待检测的代码行数计算出对应的分区,并根据该代码指纹在向量数据库中对应分区以及相邻的多个分区中搜索,并将最相似的前n个结果返回。

22、步骤(6)的具体过程为:

23、(6-1)阈值筛选,将步骤(5)中得到的结果根据预设的海明距离阈值进行筛选,只有小于该海明距离的结果做进一步细粒度比对;

24、(6-2)细粒度比对,将剩余的结果根据映射关系在本地读取对应词法的保存文件,并将两者的词法集合通过最长公共子序列lcs计算得到细粒度的相似度结果,将相似度结果大于阈值的结果保存。

25、步骤(7)的具体过程为:

26、(7-1)文件级别相似度计算,将该文件(步骤(1)中代码文件)下每个被检测函数的检测结果进行获取,针对每一个被检测函数,累加上其代码行数(后期用于计算文件相似度用)并遍历其所有的相似函数结果;对于每个相似函数结果,记录其所对应的文件名和函数相似度乘以被检测函数的代码行数(不是相似函数结果的代码行数)的映射,如果遇到被检测函数不相同但其相似函数所对应的文件已经出现的情况,则将之前结果更新为之前结果加上函数相似度乘以被检测函数的代码行数;在遍历完成后根据文件的映射值的大小进行排序,选取前n个最相似的文件作为该文件的文件级别相似结果并保存;

27、(7-2)项目级别相似度计算,在处理上传的项目时遍历其所有的被检测文件,将被检测文件按照(7-1)所述步骤进行计算得到文件级别相似度;累加上每个被检测文件的代码行(后期用于计算项目相似度用)并遍历其所有的文件相似结果,对应每个相似结果,记录该相似结果所对应的项目名和文件相似度乘以被检测文件的代码行数(不是相似文件结果的代码行数)的映射,如果遇到被检测文件不相同但其相似文件所对应的项目已经出现过的情况,则将之前结果更新为之前结果加上文件相似度乘以被检测文件的代码行数,并根据排序后的结果选取前n个最相似的项目作为该项目的项目级别相似结果并保存。

28、一种基于向量数据库的特征融合代码克隆检测装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述一个或多个处理器执行所述可执行代码时,用于实现上述基于向量数据库的特征融合代码克隆检测方法。

29、与现有技术相比,本发明具有以下有益效果:

30、1、本发明能够融合包括词法、语法和特征三种在内的代码信息生成对应的代码指纹进行相似代码检测。

31、2、本发明还采用了向量数据库进行存储和查询,相比传统的一一比较或是基于抽屉原理的分段索引比较而言在速度上有显著优势,并且根据代码的行数针对向量数据库进行分块,大大提升查询的时间,能够快速过滤得到可能相似的结果集。

32、3、本发明还根据查询的结果,做了一定规则的筛选和细粒度的相似度计算,并根据计算结果再次筛选,提高结果的相似度准确性。并根据函数级别的检测结果,反推上传的每个文件在数据库中可能相似的文件,通过文件级别的检测结果,反推上传的项目在数据库中可能相似的项目。

33、4、与现有的方法对比,本发明生成的方法以及装置在代码信息获取、代码指纹存储查找、代码相似计算中均具有显著优势。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1