当前位置: 首页 > 专利查询>东南大学专利>正文

一种基于串匹配和特征匹配的开源代码检测方法技术

技术编号:19857304 阅读:27 留言:0更新日期:2018-12-22 11:39
本发明专利技术提出了一种基于串匹配和特征匹配的开源代码检测方法,用于检测混源软件中的开源代码,从而有助于开发者进一步的重用与再开发。该方法综合了属性计数法和结构度量法各自的优缺点,首先通过特征匹配的方式来缩小数据库的搜索空间,然后依据token串的方式,基于字符串匹配算法的思想,来匹配出最大公共子串,从而在应用于大规模软件开发项目的开源代码检测时,使匹配时间和内存消耗得到进一步优化。

【技术实现步骤摘要】
一种基于串匹配和特征匹配的开源代码检测方法
本专利技术涉及一种检测方法,具体涉及一种基于串匹配和特征匹配的开源代码检测方法,属于模式匹配和数据挖掘

技术介绍
随着开源代码的日益增长,对开源代码的检测技术研究越来越多,在现有技术中,相关的方法如下:1.基于文本的比较,其将程序划分成字符串,通过比较字符串来查找重复的字符串序列,这种方法的优点是匹配与具体语言无关,实现简单方便,具有很强的灵活性和适应性,缺点是这种简单的行匹配方法检测空间巨大,对大型系统适应有限。同时,当代码有细微改变时,这种技术就检测不出来了,也就是说它只能检测出完全一致的代码。2.基于参数化匹配的检测技术,其主要思想是抓住程序中固定不变的内容,例如运算符、表达式等。其优点就是解决了变量名不同的代码重复性检测问题,而缺点在于它将代码拆分,从而使得被检测到的重复代码块很小,同时其空间复杂度也过高。3.基于抽象语法树的方法对语言进行语法分析,建立完整的抽象语法树,应用标准算法检测重复子树。考虑到大型软件系统中可能存在着大量的子树,搜索空间会非常大,因此采用了hash容器存放所有的子树,并只对hash容器进行比较。与基于文本的方法类似,基于抽象语法树的检测技术对细微修改过的重复代码的检测效果不够理想。由此产生了。4.基于依赖图(PDG)中同构子图检测重复代码的方法,虽然这种方法能够检测出重新排序后的代码,但是该方法的算法时间复杂度高达O(n4),依旧不适合应用于大型软件的检测。因此,迫切的需要一种新的方案解决该技术问题。
技术实现思路
为了提高代码匹配在大型软件项目中的匹配速度,本专利技术运用了token序列匹配的思想,同时提出了一种基于代码统计特征的快速匹配方式,将两种方法结合起来,进一步优化匹配的时间和空间复杂度,该方案基于token串匹配重复代码的方法,该方法先将程序划分成token流,然后通过识别重复的token序列来找到对应的重复代码。由于此方法使用了源代码的语法信息,因而分析更准确,并且算法的时间复杂度相对较低,适用于分析大型的软件代码。为了实现上述目的,本专利技术的技术方案如下:一种基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述方法包括以下步骤:步骤一:代码特征提取;步骤二:基于特征匹配的开源代码检测;步骤三:基于串匹配的开源代码检测。作为本专利技术的一种改进,所述步骤一:代码特征提取,具体操作如下,获取源代码文件、解析源代码文件、将源代码文件依据函数进行切分、提取相应代码文件中的统计特征和函数级别的结构特征、将相应的基本统计特征存入相应代码文件的特征库中。作为本专利技术的一种改进,所述步骤一的获取源代码文件包括从开源代码库中获取源代码文件。作为本专利技术的一种改进,所述步骤二基于特征匹配的开源代码检测,具体如下,获取待匹配的代码文件;搜索其特征库获取相应的特征信息;基于迭代计算与人工比对的方法进行特征筛选;将筛选后的特征组成特征向量与特征库中相应的特征向量做欧氏距离度量;选取度量值小于设定阈值的文件代码作为搜索的候选集。作为本专利技术的一种改进,所述步骤三基于串匹配的开源代码检测,具体如下,以候选集为搜索空间,步骤1:将源程序进行词法分析,将其转化成token串标识;步骤2:利用一些语法规则,以基本的程序块为单位将标记序列划分为若干段,创建一个标记数据库;步骤3:使用RKR-GST字符串匹配算法,得出每段的匹配串;步骤4:将较小的相邻片段组合成较大的重复代码片段,并判断此代码是否为误检;步骤5:输出最终检测到的开源代码。该方案中,所述方法包括:基于代码文件的属性统计:对于项目中不同的代码文件,选取后缀名为常用编程语言的文件进行分析,对语言进行词法语法分析,统计文件具有的相关属性,例如总行数、语句数目、分支语句比例、注释比例、函数数目、平均每个函数包含的语句数目、函数圈复杂度、函数深度等,作为后续特征匹配的待选特征值。基于词法的统一模型构建:统一模型构建即是将代码文件中可以任意变化但不影响程序功能的代码映射为统一的形式,例如将变量名统一映射为固定的值,这样就可以检测出简单修改变量名的代码。特征筛选与特征匹配:对于统计出的相关属性,对于代码匹配来说,有些属性对于检测代码相似度的关联性较小,而有些则关联性很高,通过试验比较,去除无用属性特征,最终形成一个度量代码相似度的特征向量,并根据欧式距离的大小来判定代码的相似性。距离越大,相似性越低,距离越小,相似性越高。需注意的是,这种基于距离度量的方式搜索速度较快,时间复杂度为O(n),通过这种方式快速定位相似代码范围,从而缩小了token序列匹配的搜索空间。Token序列相似度计算:两个程序段之间的相似性即为它们对应的标记串之间的相似性。可将每个标记串看成由若干个子串组成,那么两个标记串中相同的子串为它们的公共子串,因而,它们的相似性可用所有公共子串在整个串中所占的比例表示。通过运用RKR-GST字符串匹配算法的思想,得出相应重复代码,并依据以上描述计算相似度。相对于现有技术,本专利技术的有益效果如下:1)开源代码检测的准确率有进一步提高;2)开源代码检测的速度大幅度提高。附图说明图1为基于词法语法分析的属性统计示意图;图2为将源代码转化为token串的详细数据流图;图3为特征筛选与特征匹配的示意图;图4为基于Token序列的匹配流程示意图;图5为开源代码检测实施流程图。具体实施方式为了加深对本专利技术的认识和理解,下面结合附图和具体实施方式进一步介绍本专利技术。实施例1:参见图1-图5,一种基于串匹配和特征匹配的开源代码检测方法,所述方法包括以下步骤:步骤一:代码特征提取;步骤二:基于特征匹配的开源代码检测;步骤三:基于串匹配的开源代码检测。所述步骤一:代码特征提取,具体操作如下,获取源代码文件、解析源代码文件、将源代码文件依据函数进行切分、提取相应代码文件中的统计特征和函数级别的结构特征、将相应的基本统计特征存入相应代码文件的特征库中;所述步骤一的获取源代码文件包括从开源代码库中获取源代码文件。所述步骤二基于特征匹配的开源代码检测,具体如下,获取待匹配的代码文件;搜索其特征库获取相应的特征信息;基于迭代计算与人工比对的方法进行特征筛选;将筛选后的特征组成特征向量与特征库中相应的特征向量做欧氏距离度量;选取度量值小于设定阈值的文件代码作为搜索的候选集。所述步骤三基于串匹配的开源代码检测,具体如下,以候选集为搜索空间,步骤1:将源程序进行词法分析,将其转化成token串标识;步骤2:利用一些语法规则,以基本的程序块为单位将标记序列划分为若干段,创建一个标记数据库;步骤3:使用RKR-GST字符串匹配算法,得出每段的匹配串;步骤4:将较小的相邻片段组合成较大的重复代码片段,并判断此代码是否为误检;步骤5:输出最终检测到的开源代码。以下结合附图进一步阐述本专利技术的具体实施方案。对于本专利技术所应用的方法来说,针对不同的编程语言,其词法和语法的分析稍有不同,但思想万变不离其宗,这里选取java、C这样的主流语言来做说明。对于图1,输入一个java源代码,通过词法分析和关键字匹配,可以统计出源代码中所含的类有多少个,方法数有多少个,以及一些基本的代码行数,关键词个数,分支语句比例,注释比例等基本统计信息,进而再进本文档来自技高网...

【技术保护点】
1.一种基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述方法包括以下步骤:步骤一:代码特征提取;步骤二:基于特征匹配的开源代码检测;步骤三:基于串匹配的开源代码检测。

【技术特征摘要】
1.一种基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述方法包括以下步骤:步骤一:代码特征提取;步骤二:基于特征匹配的开源代码检测;步骤三:基于串匹配的开源代码检测。2.根据权利要求1所述的基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述步骤一:代码特征提取,具体操作如下,获取源代码文件、解析源代码文件、将源代码文件依据函数进行切分、提取相应代码文件中的统计特征和函数级别的结构特征、将相应的基本统计特征存入相应代码文件的特征库中。3.根据权利要求2所述的基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述步骤一的获取源代码文件包括从开源代码库中获取源代码文件。4.根据权利要求3所述的基于串匹配和特征匹配的开源代码检测方法,其特征在于,所述步骤二基于特征匹配的开源...

【专利技术属性】
技术研发人员:李必信杨安奇周颖王璐璐廖力
申请(专利权)人:东南大学
类型:发明
国别省市:江苏,32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1