一种基于关系变量图的代码相似度检测方法及系统与流程

文档序号:17988341发布日期:2019-06-22 00:35阅读:183来源:国知局
一种基于关系变量图的代码相似度检测方法及系统与流程

本发明涉及代码相似度检测领域,特别是涉及一种基于关系变量图的代码相似度检测方法及系统。



背景技术:

在当今这个信息化的时代,在教育领域,很多学生通过上网套用他人程序或者修改同学的程序来应对老师布置的学业任务,给老师的教学考核带来了很大的困扰;而在商业领域,很多企业和个人私自套用他人项目中的程序用于自己的项目,引发各种权利纠纷问题。因此,怎么有效地对代码进行查重逐渐引起人们的重视。

目前,现有的代码查重的方法无外乎都是基于字符串匹配的统计方法、基于token的方法、基于程序结构图的方法来进行的,但是这些方法均有它的不足之处,例如,基于字符串匹配的统计方法检测精度较低,无法应对变量名的修改和冗余代码的植入问题;基于token的方法检测精确性较低,虽然能够抵抗替换变量名、修改函数位置等混淆,但是其其抗混淆能力低,难以应对冗余代码的植入;基于程序结构图的方法精度较高,但其计算的时空复杂度较高,给任务量较大的查重工作带来不便。



技术实现要素:

为了现有技术存在的缺陷,本发明提供了一种基于关系变量图的代码相似度检测方法及系统,对于改动部分较多的代码也能较为高效的检测出其与原代码的相似度。

为实现上述目的,本发明提供了如下方案:

一种基于关系变量图的代码相似度检测方法,包括:

去除原代码和检测代码中的注释信息;

确定处理后的原代码和处理后的检测代码中具有传递数据关系的标识符;

确定第一相应关系和第二相应关系;所述第一相应关系为处理后的原代码中各个所述标识符之间的相应关系;所述第二相应关系为处理后的检测代码中各个所述标识符之间的相应关系;

根据所述第一相应关系建立第一有向关系变量图,根据所述第二相应关系建立第二有向关系变量图;

计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度。

可选的,所述去除原代码和检测代码中的注释信息,具体包括:

去除原代码和检测代码中的注释信息和头文件信息。

可选的,所述确定处理后的原代码和处理后的检测代码中具有传递数据关系的标识符,具体包括:

提取第一标识符和第二标识符;所述第一标识符为处理后的原代码中具有传递数据关系的标识符;所述第二标识符为处理后的检测代码中具有传递数据关系的标识符;

判断所述第一标识符是否在主函数与自定义函数外,得到第一判断结果;

若所述第一判断结果表示所述第一标识符在主函数与自定义函数外,则将所述第一标识符直接存入第一变量表内;

若所述第一判断结果表示所述第一标识符在主函数与自定义函数内,则以第一标识符+函数名的格式存入第一变量表内;

判断所述第二标识符是否在主函数与自定义函数外,得到第二判断结果;

若所述第二判断结果表示所述第二标识符在主函数与自定义函数外,则将所述第二标识符直接存入第二变量表内;

若所述第二判断结果表示所述第二标识符在主函数与自定义函数内,则以第二标识符+函数名的格式存入第二变量表内。

可选的,所述确定第一相应关系和第二相应关系,具体包括:

通过赋值关系、数组关系确定任意两个所述第一标识符之间的对应关系,进而得到多个第一相应关系;

通过赋值关系、数组关系确定任意两个所述第二标识符之间的对应关系,进而得到多个第二相应关系。

可选的,根据所述第一相应关系建立第一有向关系变量图,根据所述第二相应关系建立第二有向关系变量图,具体包括:

以所有所述第一标识符为有向关系变量图的顶点,以所有所述第一相应关系为有向关系变量图的边,建立第一有向关系变量图;

以所有所述第二标识符为有向关系变量图的顶点,以所有所述第二相应关系为有向关系变量图的边,建立第二有向关系变量图。

可选的,所述计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度,具体包括:

比较所述第一有向关系变量图与所述第二有向关系变量图中的顶点个数,将顶点个数少的有向关系变量图确定为基础有向关系变量图,将顶点个数多的有向关系变量图确定为搜索有向关系变量图;

对所述基础有向关系变量图中的第一顶点,统计所述搜索有向关系变量图中各个顶点出度大于第一顶点出度且所述搜索有向关系变量图中各个顶点入度大于第一顶点入度的顶点,并存储到第一集合内,依次类推,直到确定所述基础有向关系变量图中每个顶点对应的第一集合;

在所述基础有向关系变量图和所述搜索有向关系变量图内,搜索包含第一顶点和第一点的最大且相同的子图,并将最大且相同的子图的边数存储到第二集合内,所述第一顶点为所述基础有向关系变量图中第一个顶点,所述第一点为第一顶点对应的第一集合中的第一个点,重复上述操作,直到第一顶点对应的第一集合内所有点均搜索完成;

当第一顶点对应的第一集合内所有点均搜索完成后,重复上述操作,直到所述基础有向关系变量图中所有顶点均搜索完成;其中,所述第二集合的个数与所述基础有向关系变量图的顶点的个数相同;

根据所有所述第二集合,计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度。

可选的,所述根据所有所述第二集合,计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度,具体包括:

判断所述第二集合的个数是否等于所述基础有向关系变量图的边数,得到第三判断结果;

若所述第三判断结果表示所述第二集合的个数等于所述基础有向关系变量图的边数,则确定所述第一有向关系变量图与所述第二有向关系变量图的相似度为100%,从而确定所述原代码和所述检测代码的相似度为100%;

若所述第三判断结果表示所述第二集合的个数不等于所述基础有向关系变量图的边数,则将每个所述第二集合中的最大值存储到第三集合内,并根据所述第三集合和所述基础有向关系变量图的顶点个数,计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度。

可选的,所述根据所述第三集合和所述基础有向关系变量图的顶点个数,计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度,具体包括:

根据以下公式,计算所述第一有向关系变量图与所述第二有向关系变量图的相似度;

所述公式为

其中,sim表示所述第一有向关系变量图与所述第二有向关系变量图的相似度或者表示所述原代码和所述检测代码的相似度,n表示所述基础有向关系变量图的顶点个数,∑max[]表示第三集合中所有元素的和。

一种基于关系变量图的代码相似度检测系统,包括:

去除模块,用于去除原代码和检测代码中的注释信息;

标识符确定模块,用于确定处理后的原代码和处理后的检测代码中具有传递数据关系的标识符;

相应关系确定模块,用于确定第一相应关系和第二相应关系;所述第一相应关系为处理后的原代码中各个所述标识符之间的相应关系;所述第二相应关系为处理后的检测代码中各个所述标识符之间的相应关系;

有向关系变量图建立模块,用于根据所述第一相应关系建立第一有向关系变量图,根据所述第二相应关系建立第二有向关系变量图;

相似度计算模块,用于计算所述第一有向关系变量图与所述第二有向关系变量图的相似度,从而确定所述原代码和所述检测代码的相似度。

根据本发明提供的具体实施例,本发明公开了以下技术效果:

本发明提供了一种基于关系变量图的代码相似度检测方法及系统,旨在对程序数据流向进行分析,只要程序中数据流向相同,建成的有向关系变量图也必定相似,能够高效的检测出相似度,即对于改动部分较多的代码也能较为高效的检测出其与原代码的相似度。

除此之外,本发明排除了更改结构,更改标识符名字,增加冗余信息等抄袭手段,具有较强抗干扰能力。且本发明在计算两个图的相似度时并未完全采用贪心算法,而是对图中部分点采用贪心算法进行计算,能有效减少复杂度。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明实施例基于关系变量图的代码相似度检测方法的流程示意图;

图2为本发明实施例基于关系变量图的代码相似度检测系统的结构示意图;

图3为本发明实施例采用代码程序提取标识符的过程图;

图4为本发明实施例各个标识符之间的相应关系图;

图5为本发明实施例有向关系变量图与邻接矩阵的转换示意图;

图6为本发明实施例有向关系变量图;其中,图6(a)为顶点个数少的有向关系变量图,图6(b)为顶点个数多的有向关系变量图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。

图1为本发明实施例基于关系变量图的代码相似度检测方法的流程示意图,如图1所示,本实施例提供的代码相似度检测方法包括:

步骤101:去除原代码和检测代码中的注释信息。

步骤102:确定处理后的原代码和处理后的检测代码中具有传递数据关系的标识符。

步骤103:确定第一相应关系和第二相应关系;第一相应关系为处理后的原代码中各个标识符之间的相应关系;第二相应关系为处理后的检测代码中各个标识符之间的相应关系。

步骤104:根据第一相应关系建立第一有向关系变量图,根据第二相应关系建立第二有向关系变量图。

步骤105:计算第一有向关系变量图与第二有向关系变量图的相似度,从而确定原代码和检测代码的相似度。

优选的,步骤101具体包括:

去除原代码和检测代码中的注释信息和头文件信息等部分。

在编程语言中,标识符就是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等。

本实施例以c语音程序为例,优选的,步骤102具体包括:

步骤2.1,对处理后的原代码和处理后的检测代码分别从开始依次往后面搜索。

步骤2.2,提取第一标识符和第二标识符;第一标识符为处理后的原代码中具有传递数据关系的标识符;第二标识符为处理后的检测代码中具有传递数据关系的标识符。

步骤2.3,若该标识符的定义在主函数与自定义函数外时,直接将标识符存入变量表中;若该标识符的定义在主函数与自定义函数内时,将以函数名+标识符的格式存入变量表中。具体为:

判断第一标识符是否在主函数与自定义函数外,得到第一判断结果;若第一判断结果表示第一标识符在主函数与自定义函数外,则将第一标识符直接存入第一变量表内;若第一判断结果表示第一标识符在主函数与自定义函数内,则以第一标识符+函数名的格式存入第一变量表内。

判断第二标识符是否在主函数与自定义函数外,得到第二判断结果;若第二判断结果表示第二标识符在主函数与自定义函数外,则将第二标识符直接存入第二变量表内;若第二判断结果表示第二标识符在主函数与自定义函数内,则以第二标识符+函数名的格式存入第二变量表内。

优选的,步骤103具体包括:

通过赋值关系、数组关系等建立起各个标识符之间的对应关系,即通过赋值关系、数组关系确定任意两个第一标识符之间的对应关系,进而得到多个第一相应关系;通过赋值关系、数组关系确定任意两个第二标识符之间的对应关系,进而得到多个第二相应关系。

将标识符作为图的顶点,标识符之间的关系作为图的边,例如在赋值关系中,当第一个标识符的值赋值给第二个标识符时,则可以建立起一条由第一个标识符指向第二个标识符的有向边,例如在使用数组的时候,若数组的索引为标识符,则建立起一条由表示该索引的标识符指向表示该数组名的标识符等。

基于此,优选的,步骤104具体包括:

以所有第一标识符为有向关系变量图的顶点,以所有第一相应关系为有向关系变量图的边,建立第一有向关系变量图。

以所有第二标识符为有向关系变量图的顶点,以所有第二相应关系为有向关系变量图的边,建立第二有向关系变量图。

优选的,步骤105具体包括:

步骤5.1,比较第一有向关系变量图与第二有向关系变量图中的顶点个数,将顶点个数少的有向关系变量图确定为基础有向关系变量图,即图a,将顶点个数多的有向关系变量图确定为搜索有向关系变量图,即图b。

步骤5.2,对基础有向关系变量图中的第一顶点,统计搜索有向关系变量图中各个顶点出度大于第一顶点出度且搜索有向关系变量图中各个顶点入度大于第一顶点入度的顶点,并存储到第一集合内,依次类推,直到确定基础有向关系变量图中每个顶点对应的第一集合,即对图a的每一个顶点ai,统计出图b中各顶点bi的出度大于顶点ai的出度且入度也大于等于顶点ai的入度的顶点,并放入第一集合ai{}中。

步骤5.3,在基础有向关系变量图和搜索有向关系变量图内,搜索包含第一顶点和第一点的最大且相同的子图,并将最大且相同的子图的边数存储到第二集合内,第一顶点为基础有向关系变量图中第一个顶点,第一点为第一顶点对应的第一集合中的第一个点,重复上述操作,直到第一顶点对应的第一集合内所有点均搜索完成,即选取图a的顶点ai及顶点ai对应的第一集合ai{}中的第一个点,在图中搜索出包含这两个点的最大且相同的子图,并将最大且相同的子图的边数存入第二集合leni[]中,重复上述操作,待第一集合ai{}内所有点均搜索完成。

步骤5.4,当第一顶点对应的第一集合内所有点均搜索完成后,重复上述操作,直到基础有向关系变量图中所有顶点均搜索完成,即按步骤5.3的步骤,开始图a的下一顶点,直到图a中的所有顶点都搜索完成;其中,第二集合的个数与基础有向关系变量图的顶点的个数相同。

步骤5.5,根据所有第二集合,计算第一有向关系变量图与第二有向关系变量图的相似度,从而确定原代码和检测代码的相似度,即根据所有第二集合leni[]中的值计算出两个图的相似度,进而得出两份程序代码的相似度。具体为:

判断第二集合的个数是否等于基础有向关系变量图的边数,得到第三判断结果。

若第三判断结果表示第二集合的个数等于基础有向关系变量图的边数,则确定第一有向关系变量图与第二有向关系变量图的相似度为100%,从而确定原代码和检测代码的相似度为100%。

若第三判断结果表示第二集合的个数不等于基础有向关系变量图的边数,则将每个第二集合中的最大值存储到第三集合内,并根据第三集合和基础有向关系变量图的顶点个数,计算第一有向关系变量图与第二有向关系变量图的相似度,从而确定原代码和检测代码的相似度。其计算公式为

其中,sim表示第一有向关系变量图与第二有向关系变量图的相似度或者表示原代码和检测代码的相似度,n表示基础有向关系变量图的顶点个数,∑max[]表示第三集合中所有元素的和。

实施例2

图2为本发明实施例基于关系变量图的代码相似度检测系统的结构示意图,如图2所示,本实施例提供的基于关系变量图的代码相似度检测系统包括:

去除模块100,用于去除原代码和检测代码中的注释信息。

标识符确定模块200,用于确定处理后的原代码和处理后的检测代码中具有传递数据关系的标识符。

相应关系确定模块300,用于确定第一相应关系和第二相应关系;第一相应关系为处理后的原代码中各个标识符之间的相应关系;第二相应关系为处理后的检测代码中各个标识符之间的相应关系。

有向关系变量图建立模块400,用于根据第一相应关系建立第一有向关系变量图,根据第二相应关系建立第二有向关系变量图。

相似度计算模块500,用于计算第一有向关系变量图与第二有向关系变量图的相似度,从而确定原代码和检测代码的相似度。

实施例3

本实施例提供了一种基于关系变量图的代码相似度检测方法,该方法包括:

步骤1,去除代码程序中的注释信息;代码程序包括原代码和检测代码。

步骤1在代码检测中起到一个辅助的作用,去除注释信息与头文件信息有利于后续标识符的提取以及关系的提取工作,具体步骤包括:

去除代码中的注释信息,如:/**/之间的内容及//之后的内容,去除导入的头文件信息。

步骤2,提取处理后的代码程序中能传递数据关系的标识符。

步骤2的目的在于提取到代码中能传递数据关系的标识符,这是为了后面提取关系奠定基础,具体步骤包括:

这里以c语言程序代码为例,将其中定义的一般变量名,指针型变量名,结构体型变量名,数组名存储进一个变量表中,提取标识符的过程可参见图3所示。

步骤3,提取代码程序中能传递数据关系的标识符与标识符之间的相应关系。

步骤3的目的在于提取代码中两个能传递数据关系的标识符之间的关系,将这两个标识符名作为图的顶点,它们的关系作为图的边,如图4所示,具体步骤包括:

步骤3.1,在步骤2开始提取标识符的同时,也提取各个标识符之间的关系,寻找类似a[b],a=b这样的结构。

步骤3.2,判断a,b是否都在之前建立的变量表中。

步骤3.3,若a,b都在变量表中,则建立起a,b之间的关系,在图中表示为b->a。

步骤4,将步骤3提取的关系建成一张有向的关系图。

步骤4的目的是为了后面计算相似度提供方便,具体步骤包括:

将提取的关系用邻接矩阵存储,一份程序建成的图与邻接矩阵转换过程可参见图5所示,其中0代表没关系,1、2代表边的方向。

步骤5,比较两份程序代码建成的关系变量图,获得两张关系变量图的相似度,从而得出与之对应的程序代码的相似度。

步骤5的目的是通过两张关系图的相似度,反应两份程序代码的相似度,具体步骤包括:

步骤5.1,在此以图6中的图(a)和图(b)为例,首先选取顶点个数少的一个图并命名为图a,另一个图为图b,对图a的每一个顶点ai,统计出图b中各顶点bi的出度大于顶点ai的出度且入度也大于等于顶点ai的入度的顶点,并放入集合ai{}中,即以下样例的aa={1,2,4},ab={2,4},ac={1,2,4},ad={1,2,3,4,5}。

步骤5.2,选取图a的第一个顶点a,在图a中从点a开始,同时选取集合aa{}中的第一个点1,搜索出包含这两个点的最大且相同的子图。在此例中,图a中为包含点a,b,c,d这个子图,图b中为包含点1,2,4,5这个子图。

步骤5.3,将搜索出的最大且相同的子图的边数len存入集合leni[]中,待集合ai{}中所有点均搜索完成后,按步骤5.2开始图a的下一个顶点的搜索。

步骤5.4,若搜索时发现集合leni[]的个数与图a的边数相同时,则两份程序代码的相似度sim=100%,程序结束。

步骤5.5,若搜索时发现集合leni[]的个数与图a的边数不相同,则将各个集合leni[]中的最大值存入集合max[]中。

步骤5.6,根据如下公式得出两个图的相似度,进而得出两份程序代码的相似度;其计算公式为

其中,sim表示两份程序代码的相似度,n表示图a的顶点个数,∑max[]表示集合max[]中所有元素的和。

本发明可以有效避免大幅度更改原程序而减少相似度的问题,只要两份程序的数据流向相似,那么它们的关系图也同样具有高重复部分。因此,不管如何改变一份程序的结构,如何对其进行增减代码,替换代码等手段,要想实现这个功能,数据之间的关系必然不会有太大的改变,从而关系图也不会有太大的改变。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1