[发明专利]一种采用GPU加速的近似代码克隆检测方法有效
申请号: | 201910065276.0 | 申请日: | 2019-01-23 |
公开(公告)号: | CN109828785B | 公开(公告)日: | 2022-04-12 |
发明(设计)人: | 吴毅坚;彭鑫 | 申请(专利权)人: | 复旦大学 |
主分类号: | G06F8/75 | 分类号: | G06F8/75 |
代理公司: | 上海正旦专利代理有限公司 31200 | 代理人: | 陆飞;陆尤 |
地址: | 200433 *** | 国省代码: | 上海;31 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 采用 gpu 加速 近似 代码 克隆 检测 方法 | ||
1.一种检测效率高的在大规模代码环境下快速检测近似克隆的方法,其特征在于,采用后缀数组作为代码的内部表示形式,在后缀数组构造和近似克隆检测方面采用GPU加速计算,具体步骤如下:
(1)将代码库中的所有源代码进行标签化,通过特征词表对代码文本进行转换,将代码中的类型名、标识符、常量、计算符以及其他终结符转换为标签,并将所有代码文件中的非注释内容以标签的形式串接起来形成一个完整的串;
(2)对所建立的标签串采用数据并行的前缀倍增方法构造代码标签串的后缀数组;
(3)根据代码标签串的后缀数组表示形式,检查后缀数组相邻元素所对应的代码标签后缀串的相同前缀的长度
(4)对候选代码克隆的两段克隆代码片段根据所在的位置进行排序;
(5)对相邻的候选代码克隆检查是否可以合并为一个近似克隆,如果两个相邻的候选代码克隆中,一个克隆的两个代码片段所在的位置与另一个克隆的两个代码片段所在的位置分别对应,并且符合近似克隆的判别标准,则这两个克隆合并为一个近似克隆;
步骤(3)中,所述的候选代码克隆由一个五元组来表示,具体为:设候选代码克隆中两段代码分别对应代码标签串的第a个标签开始和第b个标签开始的n个标签长度;该两段代码分别记为a和b;设代码片段a所在的位置为M1,代码片段b所在的位置为M2,则该候选代码克隆表示为五元组(a,b,n,M1,M2);
步骤(4)中所述的对候选代码克隆的两段克隆代码片段根据所在的位置进行排序,具体操作流程如下:对候选代码克隆五元组(a,b,n,M1,M2),根据M1和M2采用CUDA中stable_sort_by_key函数进行排序,则所有在相同位置对中的多个候选代码克隆在候选代码克隆列表中连续相邻,即产生这样的排序结果为:对该候选代码克隆的两个代码片段a和b,与另一个候选代码克隆的两个代码片段c和d而言,如果a和c都处于M1中、b和d都处于M2中,则经过排序后,这两个候选代码克隆在候选代码克隆列表中相邻;或者,即便它们不相邻,它们之间的所有候选代码克隆的两个代码片段所在位置也都是M1和M2;
步骤(5)中所述的判别是否符合近似克隆的标准分为方法粒度的判别标准和片段粒度的判别标准;其中;
方法粒度的判别是否符合近似克隆的标准是指,两个克隆A(a,b,n,M1,M2)和B(c,d,m,M3,M4)同时满足以下条件:(1)M1等于M3并且M2等于M4;(2)在步骤(4)中根据所在位置排序后,A和B在候选代码克隆列表中相邻;(3)克隆A和克隆B中在M1中的代码总长度占M1的代码长度的比例达到至少70%;(4)克隆A和克隆B中在方法M2中的代码总长度占M2的代码长度的比例达到至少70%;
片段粒度的判别是否符合近似克隆的标准是指,两个克隆A(a,b,n,M1,M2)和B(c,d,m,M3,M4)满足以下条件:(1)M1等于M3并且M2等于M4;(2)在步骤(4)中根据所在位置排序后,A和B在候选代码克隆列表中相邻;(3)假设ac,即克隆A在M1中的片段在克隆B的片段之前,那么克隆A和克隆B中在方法M1中的代码长度的和占从克隆A的片段起始处到克隆B的代码结尾处的长度的比例达到至少70%;(4)假设bd,即克隆A在M2中的片段在克隆B的片段之前,那么克隆A和克隆B中在方法M2中的代码长度的和占从克隆A的片段起始处到克隆B的代码结尾处的总长度的比例达到至少70%。
2.根据权利要求1所述的方法,其特征在于,步骤(3)中,所采用的最小克隆长度阈值选择
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于复旦大学,未经复旦大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910065276.0/1.html,转载请声明来源钻瓜专利网。