利索能及
我要发布
收藏
专利号: 2022109116991
申请人: 西安电子科技大学
专利类型:发明专利
专利状态:已下证
更新日期:2026-06-16
缴费截止日期: 暂无
联系人

摘要:

权利要求书:

1.一种基于频繁序列挖掘的代码克隆检测方法,其特征在于,包括如下步骤:(1)使用ANTLR4工具的元语言定义不同编程语言的后缀名为g4的语法文件Grammer,根据Grammer分别生成词法工具和语法解析工具;

(2)使用上述工具对源代码文件进行解析,生成抽象语法树;

(3)解析抽象语法树,以过滤掉源代码中的头文件、空行及注释,获取源代码中每个函数包含的Token集的起始和终止位置集合,并对过长的函数分片;

(4)遍历起始和终止位置集合获取每个函数包含的所有Token,将函数中的Token进行标准化处理并将在源代码同一行的Token合并成序列;

(5)对每个函数中每个序列进行Hash化,并为每个序列建立索引保存到函数序列集,为每个函数序列集分配唯一标识ID,利用源代码中的多个函数序列集构成序列数据库;

(6)对序列数据库使用闭合模式挖掘算法ClaSp查找支持度至少为2的频繁子序列,同时将ClaSp中生成的序列ID替换为上述序列数据库中的函数序列集ID,得到频繁子序列和函数序列集ID组成的频繁结果集;

(7)对频繁结果集的每一个频繁子序列通过函数序列集ID两两构建候选克隆对,并将其保存到克隆对集合中;

(8)通过对克隆对集合中的每个候选克隆对的两个函数序列集ID构建唯一关键字来扩展去除重复出现的候选克隆对,再将剩下具有唯一性的候选克隆对中重复出现的克隆行去除掉;

(9)设置克隆大小size、克隆大小差值diff、间隙阈值gap及克隆大小最小值min参数;

(10)对克隆对集中任意一个候选克隆集大小小于size的候选克隆对和候选克隆对中两个候选克隆集大小差值大于diff的结果对进行过滤;

(11)对过滤后的克隆对集中的候选克隆对中的克隆行进行从小到大排序,并通过设置的gap和min对克隆行进行分组,即记录两个连续克隆行差值小于gap的行直到大于gap,将记录的克隆行生成行组,并过滤掉其小于min的行组;

(12)遍历克隆对集中每个候选克隆对,对候选克隆对中的行组进行匹配,将匹配到的行组组成最终克隆对,得到最终克隆对集,完成对代码的克隆检测。

2.根据权利要求1所述的方法,其特征在于,所述步骤(3)解析抽象语法树,是重写解析工具中接口记录源代码中每个函数所包含的Token的起始和终止位置,生成抽象语法树并遍历,获取每个函数的Token。

3.根据权利要求1所述的方法,其特征在于,所述步骤(4)将函数中的Token进行标准化处理,是将数字类型,包括整型、浮点型转换为“$”,将单引号的字符或双引号中的字符串转换为“#”,将标识符变量转换为“@”。

4.根据权利要求1所述的方法,其特征在于,所述步骤(5)对每个函数中每个序列进行Hash化,是采用HashPJW算法进行,具体实现如下:(5a)输入字符串;

(5b)读取字符串中的一个8位的字符;

(5c)将原Hash值左移4位再加上步骤(5b)中的字符;

(5d)判断最高4位是否为0000,若不全为0,则用最高8位与第1‑8位杂糅,再将最高4位改写为0000;

(5e)重复(5b)‑(5d),直到字符串末尾,得到Hash值。

5.根据权利要求1所述的方法,其特征在于,所述步骤(6)对序列数据库使用闭合模式挖掘算法ClaSp查找支持度至少为2的频繁子序列,实现如下:(6a)读入序列数据库中的数据,建立序列字典树;

(6b)设置最小支持度为2,从序列数据库中挖掘寻找频繁1序列集L1,生成频繁闭序列候选集FCC;

(6c)将L1中的所有频繁1序列分别作为起始模式串,对起始模式串分别进行序列扩展和项集扩展得到模式串p;

(6d)对模式串p执行递归剪枝搜索算法进行剪枝,剪枝规则如下:′ ′ ′

对于递归生成的模式串p′,若频繁序列p先于p被发现,且p包含p,当且仅当p与p的支′持度相同则停止搜索p在序列字典树的所有后代子树;

′ ′ ′ ′

对于递归生成的模式串p,若频繁序列p先于p被发现,且p包含p,当且仅当p与p的支′持度相同则将在序列字典树中的所有子树移植给p;

(6e)将剪枝后得到的频繁模式串更新到FCC;

(6f)去除FCC中非闭合的频繁模式集,得到闭合频繁结果集FCS。

6.根据权利要求1所述的方法,其特征在于,所述步骤(7)中对频繁结果集的每一个频繁子序列通过函数序列集ID两两构建候选克隆对,实现如下:(7a)遍历频繁结果集中的每个结果,将每个结果根据函数序列集ID两两组合;

(7b)将上述组合中的函数序列集中的序列通过步骤(5)的索引得到原始行号获取克隆行集;

(7c)用组合中各自的克隆行集和函数序列集ID共同组成候选克隆对。

7.根据权利要求1所述的方法,其特征在于,所述步骤(8)通过对克隆对集合中的每个候选克隆对的两个函数序列集ID构建唯一关键字来扩展去除重复出现的候选克隆对,实现如下:(8a)获取两个函数序列集ID分别表示为x和y,且x

(8b)使用x,y生成唯一关键字x|y;

(8c)遍历克隆对集合,对生成相同关键字的候选克隆对,使用之后重复的候选克隆对再对第一次生成关键字的候选克隆对进行扩展,以保证候选克隆对唯一。

8.根据权利要求1所述的方法,其特征在于,所述步骤(12)对候选克隆对中的行组进行匹配,实现如下:(12a)通过(5)中索引获取行序列的Hash值;

(12b)按如下匹配原则对行组中的Hash值进行匹配:若两个行组中的第一项和最后一项相同,则行组匹配成功;

若行组中的第一项与另一个行组中的第一项或第二项相同,且两个行组大小差值小于克隆大小差值diff,则行组匹配成功;

若行组中的第一项或第二项与另一个行组中的第一项相同,且两个行组大小差值小于克隆大小差值diff,则行组匹配成功。