[发明专利]面向C语言的源代码克隆检测方法有效
申请号: | 201811105462.4 | 申请日: | 2018-09-21 |
公开(公告)号: | CN110209425B | 公开(公告)日: | 2022-03-15 |
发明(设计)人: | 桂盛霖;徐参语;陈一凡 | 申请(专利权)人: | 电子科技大学 |
主分类号: | G06F8/75 | 分类号: | G06F8/75 |
代理公司: | 电子科技大学专利中心 51203 | 代理人: | 周刘英 |
地址: | 611731 四川省成*** | 国省代码: | 四川;51 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 面向 语言 源代码 克隆 检测 方法 | ||
1.面向C语言的源代码克隆检测方法,其特征在于,包括下列步骤:
步骤1:基于设置的语法规则定义文件分别对输入的C源代码进行从上到下的解析处理,得到输入的C源代码的解析树;
其中,语法规则定义文件采用txl语言编写,以上下文无关文法对C语言语法规则进行定义,包括:
定义一个C程序源文件为一个非终结符;
定义表示C程序源文件的非终结符是一个非终结符语法单元,其包括一系列表示函数定义的非终结符、声明语句的非终结符,其中,表示函数定义的非终结符包括表示函数头的非终结符和函数体的非终结符;表示声明语句的非终结符包括表示变量声明语句的非终结符和表示变量初始化语句的非终结符;
得到输入的C源代码的解析树具体包括:
整个C程序源文件会被识别为一个非终结符,即根节点;然后该非终结符进一步被解析为一个非终结符语法单元,即语法单元为根节点的唯一子节点;非终结符语法单元所在的节点被进一步解析为一系列表示函数定义、表示声明语句的子节点;对得到的子节点再进一步解析为其下的子节点,其中表示函数定义的节点将被进一步解析为表示函数头的子节点和表示函数体的子节点,表示声明语句的节点将被进一步解析为表示变量声明语句的子节点和表示变量初始化语句的子节点;
解析过程持续进行,直到每个非终结符都被解析为一系列的非终结符,最终生成一棵C源代码的解析树;
步骤2:基于设置的C函数提取文件提取C源代码中的C函数:
基于C函数提取文件转化步骤1得到的解析树,再对转化后的解析树进行C程序源文件还原处理,还原得到的C程序源文件以XML文件形式保存,包括所有提取出的C函数,每个C函数都标注其所属的源文件名、开始与结束的源代码行号;
其中,C函数提取文件采用txl语言编写,引用语法规则定义文件对C语言语法的定义,并重写表示C程序源文件的非终结符定义与表示函数的非终结符定义:
定义表示C程序源文件的非终结符由一系列表示函数定义的非终结符和表示声明语句的非终结符组成;
在表示函数定义的非终结符定义中添加伪非终结符,用于记录函数所属源文件名、开始行位置信息和结束行位置信息;
步骤3:LCS克隆检测处理:
对于当前待比较函数F,记其代码序列长度为L,基于预设的差异率阈值T计算函数F允许的克隆函数的长度范围为:[L-L*T,L+L*T];
对与函数F进行克隆检测的所有函数,根据函数的代码序列长度从大到小排序;
仅对函数的代码序列长度落入长度范围[L-L*T,L+L*T]的函数行LCS克隆检测处理,查找当前待比较函数F的克隆函数;
其中,LCS克隆检测处理具体为:
S301:对于与函数F进行比较的函数Ft,记函数Ft的代码序列长度为Lt,提取F和Ft的代码序列的最长公共子序列C,记其长度为LC;
S302:分别计算F和Ft中独有的子序列的长度L′和Lt′,其中L′=L-LC,Lt′=Lt-LC;
S303:计算F和Ft的差异率,分别记为P和Pt,其中P=(L′/L)×100%,Pt=(Lt′/Lt)×100%;
S304:将P和Pt分别与差异率阈值T进行比较,若P和Pt都低于T,则判定Ft为函数F的克隆函数;否则F和Ft不构成克隆函数。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于电子科技大学,未经电子科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201811105462.4/1.html,转载请声明来源钻瓜专利网。