[发明专利]基于LLVM的克隆代码检测方法有效
申请号: | 201711274665.1 | 申请日: | 2017-12-06 |
公开(公告)号: | CN107943516B | 公开(公告)日: | 2020-11-13 |
发明(设计)人: | 张迎周;陈星昊;王星;尹秀;赵莲 | 申请(专利权)人: | 南京邮电大学 |
主分类号: | G06F8/75 | 分类号: | G06F8/75;G06F11/36 |
代理公司: | 南京知识律师事务所 32207 | 代理人: | 张芳 |
地址: | 210046 江苏省南京市*** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 llvm 克隆 代码 检测 方法 | ||
1.基于LLVM的克隆代码检测方法,包括以下步骤:
步骤1,源代码预处理:将源代码转换成中间代码;获取中间代码程序依赖关系,计算出中间代码的SDG图;
步骤2,合并映射:合并来自同一源语句的多个节点并对节点进行模糊化处理,形成该语句的特征并保留依赖关系;从LLVM的依赖关系中把节点映射到源语句行号;查找每个节点的出方向,使每一条边映射为(行号1,行号2)的形式;
步骤3,提取分片:从关系集中选取一个节点,提取其前节点和后节点;提取出当前节点与其前、后节点构成的结构子图分片;发送所述分片到匹配程序作为输入参数;
步骤4,匹配:根据每个分片起始点选取待匹配的代码切入位置,利用节点内容的对比来鉴别是否为克隆节点,匹配时主要依据当前节点的前后节点与当前节点的自带特征;如果确定节点内容相同,则匹配到的节点与其前后节点加入候选序列,否则根据相似度大小,从高到低加入候选序列,直到找到所有满足相似度阈值的结果并发送候选序列到汇总程序作为输入参数;
步骤5,汇总结果:首先每个节点都接收到候选序列,如果两个相邻的节点,在前节点的候选序列中后节点包含后节点的候选序列中匹配到的节点,后节点的候选序列中包含前节点的候选序列中匹配到的节点,则认为这两个节点之间存在关系,即作为连续的克隆代码,否则不作为连续的克隆代码;递归查找所有连接的边获得最大的关联图;
步骤6,选用没有作为起始的边循环步骤5,直到所有边都进行了判断;
其中步骤2的具体过程,其特征在于,包括以下步骤:
步骤2.1、选择合并节点
选择源语句特征相同的一个或者几个语句,准备进行合并,源语句的特征是其行号;
步骤2.2、合并内容
合并节点内容时将节点包含的语句简化为调用不带参数的基础指令,以获得模糊化的内容;将这几个节点合并为一个基于行号的节点而这一个节点的内容定义为该节点特征;
步骤2.3、合并依赖
保留节点依赖关系,包括全部与合并节点有关的数据依赖与控制依赖,并去除重复依赖;
步骤2.4、节点映射源语句行号
每个合并后的节点都映射为源语句的行号,语句行号与节点内容形成键值对;对于没有行号的节点代表数是源程序转换成IR中间语言生成的额外指令,不需要映射;
步骤2.5、边映射
对于每个边遍历查找,构成(行号1,行号2)形式的边,求出所有边与行号构成的语句关系图。
2.根据权利要求1所述的基于LLVM的克隆代码检测方法,其特征在于,在直接获得源语言行号之间关系的情况下,省略步骤2。
3.根据权利要求1所述的基于LLVM的克隆代码检测方法,其特征在于,步骤4具体为:
步骤4.1、接收分片
匹配程序中接收到一个格式为(节点内容,行号,前节点内容序列,后节点内容序列)的分片;
步骤4.2、起始点匹配
将接收到的节点内容与待检测语句关系图进行匹配,匹配时对比两个节点内容,节点内容相同则定义为起始节点;
步骤4.3、前节点匹配
从匹配到的起始节点,采用广度优先方法查找待检测节点的前节点并匹配接收到的前节点内容序列,如果待检测节点的前节点内容与接受到的前节点内容序列中的节点内容相同,则待检测节点的前节点匹配成功,保存待检测节点的前节点映射行号,查询下一个节点,直到匹配接收到的前节点内容序列都完成了匹配或者匹配结束;
步骤4.4、后节点匹配
从匹配到的起始节点,采用广度优先方法查找待检测节点的后节点并匹配接收到的后节点内容序列,如果待检测节点的后节点内容与接受到的后节点内容序列中的节点内容相同,则待检测当前节点的后节点匹配成功,保存待检测节点的后节点映射行号,查询下一个节点,直到匹配接收到的后节点内容序列都完成了匹配或者匹配结束;
步骤4.5、计算相似度并加入候选序列
Metric=(已匹配前节点序列的长度+已匹配后节点序列的长度)/(接收的前节点内容序列+接收的后节点内容序列)
当Metric值为0则直接丢弃不加入候选序列;当Metric值大于0按顺序插入候选序列,插入的形式为(匹配点,行号,已匹配前节点序列,已匹配后节点序列);
步骤4.6、发送结果
发送候选序列到汇总程序。
4.根据权利要求1所述的基于LLVM的克隆代码检测方法,其特征在于,步骤5具体为:
步骤5.1、接受候选序列与行号
将接受的候选序列映射到行号;
步骤5.2、选取起始边
用标准语句关系图给当前图进行初始化,从当前图中选一个未查找边,判断两个顶点A和B,边为A-B,如果存在a∈A的候选序列,b∈B的候选序列,a∈b的前节点序列,b∈a的后节点序列则定义为A,B存在关联,B-A也同理,否则删除语句关系图的边;
步骤5.3、处理端点
当A,B存在关联,A中候选序列筛选剩下与B有关联的节点,B中候选序列筛选剩下与A有关联的节点,将A,B两个点加入克隆代码序列与查找序列,并将A,B中间的边标记为已查找;
步骤5.4、递归查找
查找序列中提取一个点,查找所有不是已用的边,如果另一个端点在克隆代码序列中则把边标记为已用,如果不在克隆代码序列中则经过步骤5.2~步骤5.3,直到查询序列为空;
步骤5.5、输出克隆代码序列
输出克隆代码序列,并初始化;
步骤5.6、查找所有边
跳转到步骤5.2,直到所有边都标记为已查找。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京邮电大学,未经南京邮电大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201711274665.1/1.html,转载请声明来源钻瓜专利网。