CN104598231A - Python源代码文件相似性检测方法 - Google Patents
Python源代码文件相似性检测方法 Download PDFInfo
- Publication number
- CN104598231A CN104598231A CN201510014906.3A CN201510014906A CN104598231A CN 104598231 A CN104598231 A CN 104598231A CN 201510014906 A CN201510014906 A CN 201510014906A CN 104598231 A CN104598231 A CN 104598231A
- Authority
- CN
- China
- Prior art keywords
- row
- list
- index1
- similarity
- line
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种Python源代码文件相似性检测方法,涉及计算机技术领域,可以准确检测出相同或相似的源代码。所述方法包括:根据用户输入的不同的参数类型,采用不同的检测方法进行检测,在检测时,读取文件内容并进行预处理,删除多余的空格和换行符,然后根据指定的相似性标准对代码进行比对,在比对时忽略注释行,采用逐行迭加的方式消除代码布局不同的影响。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种Python源代码文件相似性检测方法。
背景技术
目前,由于互联网的快速发展和开源社区的普及,很多程序员已经很少自己独立完成编写代码的工作,更多的是从网上搜索并复制相关功能代码,然后将大量代码拼凑起来实现自己的功能,尤其对于非核心的外围代码更是如此。在软件编程过程中,源代码的复制和粘贴是非常频繁的操作,尤其是设计不够好的软件开发中或者水平较低的程序员编写代码的过程中,代码的低级复用较多,这种情况更为常见。借鉴优秀的代码固然能够缩短开发周期,提高开发效率,但不幸的是,很多程序员并不对复制来的代码进行安全性和功能性检查,只要实现功能满足当前的需求即可。这样会使得自己的软件产品中可能存在无用功能代码,这些无用功能可能会成为黑客攻击的突破口。更重要的是,原始代码被发现安全漏洞以后很难保证所有的使用者都能清楚地知道并对代码做出正确的修改。如果有一天某块代码被发现存在bug,而该代码块又被复制过很多次,那么就需要检查所有的相同代码进行正确的修改,如果有漏掉的代码块,则存在一个潜在的漏掉而使得整个软件不安全,即“木桶原则”。
发明内容
本发明实施例提供了一种Python源代码文件相似性检测方法,可以准确检测出相同或相似的源代码。
本发明实施例提供了一种Python源代码文件相似性检测方法,包括以下步骤:
一种Python源代码文件相似性检测方法,其特征在于,包括以下步骤:
S1、获取用户输入的参数类型;
S2、若判断出所述用户输入文件的参数类型为一个Python源文件,则应用算法A检测所述Python源文件内代码之间的相似性;
S3、若判断出所述用户输入文件的参数类型为一个包含Python源文件的文件夹,则应用算法B检测所述文件夹中所有Python源文件之间的相似性;
S4、若判断出所述用户输入文件的参数类型为一个目标Python源文件和一个包含Python源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文件夹中所有Python源文件之间的相似性。
具体的算法A、B、C在具体实施例中进行说明。
本发明的有益效果:本申请提供的方法,在进行相似相检测时先对读取文件内容并进行预处理,将内容重新格式化,过滤干扰因素,然后根据指定的相似性标准对代码进行比对,在比对时忽略注释行,采用逐行迭加的方式消除代码布局不同的影响,提高判断精度,减少误差。本发明支持Python源文件代码的精确匹配和模糊匹配,支持两种不同精度要求的代码相似性检测,支持不同布局代码之间的相似性检测。本发明稍加修改同样适用于其他语言源代码相似性检测,并且可以根据需要增加其他相似性判断标准,具有很好的可扩展性。
附图说明
图1本发明实施例提供的一种Python源代码文件相似性检测方法的流程示意图;
图2本发明实施例提供的一种算法C的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供的方法可以接受不同的使用方式:1)如果输入一个Python源文件则自动检测该文件中代码块之间的相似性;2)如果输入一个文件夹则可以检测该文件夹中所有Python源代码文件之间的相似性;3)如果输入一个文件和一个文件夹则自动检测该文件与文件夹中所有Python源文件的相似性。本方法的检测结果为相似行的起始行号以及相似代码行数。可以检测不同行数代码的相似性,可以针对同一段代码检测不同跨度的相似性,返回结果为不同位置与原始代码的最大相似度(即相似的代码行数)。本方法还允许指定精度参数,可以支持不同精确率的相似性检测,支持模糊匹配,给用户较大的自由度。
本方法存储的相似性检测结果用到的主要数据结构是Python字典,Result,其中每个条目的键表示原始行号,值为一个列表,列表中的元素仍为列表,其中每个元素分别表示重复的文件名、行号和行数:
{origin1:[[file1,start11,span11],[file1,start12,span12],[file2,start13,span13]],
origin2:[[file1,start21,span21],[file3,start22,span22],…]],
origin3:[[file5,start31,span31],…],
…}
以其中条目2为例,表示目标文件中从origin2开始的span21行与file1中start21开始的span21行相似,目标文件中从origin2开始的span22行与file3中start22开始的span22行相似,其他以此类推。
本发明实施例提供了一种Python源代码文件相似性检测方法,所述方法包括以下步骤:
S1、获取用户输入的参数类型。
S2、若判断出所述用户输入文件的参数类型为一个Python源文件,则应用算法A检测所述Python源文件内代码之间的相似性。
S3、若判断出所述用户输入文件的参数类型为一个包含Python源文件的文件夹,则应用算法B检测所述文件夹中所有Python源文件之间的相似性。
S4、若判断出所述用户输入文件的参数类型为一个目标Python源文件和一个包含Python源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文件夹中所有Python源文件之间的相似性。
其中,用来检测同一个Python源文件内代码之间相似性的算法A为:
A1、将用户输入的所述Python源文件中的所有行读入列表;对所有读入内容进行预处理,删除读入内容中所有多余的空格、每行两端的空格以及行尾的换行符;
所述Python源文件中每一行,读入列表中为所述列表中一个元素。
所述多余的空格即2个相邻标识符或运算符之间最多只保留一个空格,其他空格都是多余的空格,需要删除。
A2、从0开始依次为每个元素标号,令index1=0;进行步骤A3-A9;
A3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;所述当前行为标号index1所标识的行;
对于Python语言源文件,除了以“#”开始的为注释行,注释还有另外两种形式:即包含在一对“″′”或一对“″″″”之间的单行或多行注释。根据这个特点,本发明中,注释判断算法如下:如果当前行以“#”开始,则判断为注释行直接跳过;如果当前行以“″′”或“″″″”开始,则继续判断后面的连续多行,直至遇到以“″′”或“″″″”结尾的行,并返回注释的行数。
注释行不需要被比较相似性,故跳过所有注释行。
示例的,假设第0-5行为注释行,如果当前行为第0行,且第0行被判断为注释行,则可以跳过从第0行开始的所有6行注释行,即跳过第0-5行。
A4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
这里的相似性比较是通过查询Result字典获取信息,目的是为了加快速度,避免重复的相似性比较。
示例的,假设第0-5行为代码行,且0-5行与50-55行代码相似,则当当前行为50行时,可以判断出当前行为相似行,则跳过从第50行开始的所有6行连续相似行;即跳过第50-55行。
当然,在初始index1=0时,当前行为第0行,当前行没有代码行进行对比,不是相似行。
A5、遍历列表中index1之后的剩余元素,令index2=index1+1,进行步骤A6-A8;
假设,初始时,第0行即不是注释行也不是代码行,则列表中未被判断过或跳过的剩余元素即为第1行以及第1行之后的所有行,此时,index2=1。
A6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;此处的当前行为标号index2所标识的行;
A7、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
A8、对比以标号index1和标号index2开始的若干连续行的相似性,如果符合相似性检测标准,则将相似性结果更新到Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则将index2增加1;
当index2小于等于列表中最后一个元素编号时,继续进行步骤A6-A8;
这样循环进行步骤A6-A8,就可以将index1所标识开始的连续行与剩余元素的行都进行了相似性对比。
A9、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;
在步骤A9中重置index1的值后,当index1小于等于列表中最后一个元素编号时,继续循环进行步骤A3-A9。
假设,Result字典中记录的,与标号index1行开始的若干行相似连续相似行,有5行相似的,也有10行相似的,这时index1行的最大相似跨度为10行,将index1增加10行的步长。
这样,在大循环A3-A9中进行小循环A6-A8,就可以将各个代码行与其他代码行都进行了相似性比较。
用来检测同一个文件夹中所有Python源文件之间相似性的算法B为:
B1、将所述用户输入的文件夹中所有Python源文件内容读入至列表allFiles,列表allFiles的每个元素是一个列表,每个列表中的第0个元素为文件名,第1个元素是包含该文件所有代码行的列表;同时对读取的所有内容进行预处理,删除读取的所有内容中的所有多余的空格、每行两端的空格以及行尾的换行符;
即在读入后,文件夹中的每个文件为列表allFiles中的一个列表,每个列表中的第0个元素为该文件的文件名,第1个元素是该文件的所有代码行。此处多余的空格与步骤A1中多余的空格意义相同。
B2、从0开始,依次为列表allFiles中各个列表标号,令index0=0;进行步骤B3-B13;
B3、从0开始依次为标号为index0的列表中的元素标号,令index1=0;进行步骤B4-B12;
B4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
B5、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
B6、选择标号为index3的列表,其中,index3=index0+1;进行步骤B7-B11;
B7、从0开始依次为标号为index3的列表中的元素标号,令index2=0;进行步骤B8-B10;
B8、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
B9、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
B10、对比分别以index1和index2开始的若干连续行相似性,如果符合相似性检测标准,则更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则将index2增加1行;
当index2小于等于编号为index3的列表最后一个元素编号时,继续进行步骤B8-B10;
这样循环进行步骤B8-B10,就可以将index1所标识开始的若干连续行与index3标识的列表中的所有行都进行了相似性对比。
B11、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,继续进行步骤B7-B11;
这样,就可以将index1所标识的行与剩余文件的列表中的所有行都进行了相似性对比。
B12、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;
在步骤B12中重置index1的值后,当index1小于等于index0的列表中的最后一个元素编号时,继续循环进行步骤B4-B12。
B13、将index0增加1,当index0小于等于allFiles列表中最后一个元素编号时,循环进行步骤B3-B13。
在具体实现时,如果文件过多过大,为了避免占用太多内存,可以调整本算法为在循环内部根据需要实时读取文件内容,通过增加文件的IO操作来节省内存占用。
所述目标Python源文件与所述目标文件夹中所有Python源文件之间相似性的算法C为:
C1、将所述用户输入的目标文件夹中所有Python源文件内容读入至目标列表allFiles,目标列表allFiles的每个元素是一个列表,该列表的第0个元素为文件名,第1个元素是包含该文件所有代码行的;列表;同时将所述用户输入的目标Python源文件内容读入至目标列表currentFile;对所有读入内容进行预处理,删除文件中所有多余的空格、每行两端的空格以及行尾的换行符;
这里文件夹和文件的读入可以参考步骤A1和B1中的描述。
此步为图2中的预处理。
C2、从0开始依次为目标列表currentFile中的元素标号,令indexl=0;
当indexl小于等于currentFile列表中最后一个元素编号时,进行步骤C3-C9;
此步为图2中的index1=0。
C3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
C4、从0开始,依次为列表allFiles中各个列表标号,令index3=0;进行步骤C5-C8;
此步相当于图2中的“读取文件夹中的一个文件”。
C5、从0开始依次为标号为index3的列表中的元素标号,令index2=0;进行步骤C6-C7;
此步为图2中的index2=0。
C6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
C7、对比分别以index1和index2开始的若干连续行相似性,如果符合相似性检测标准,则更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则index2增加1;若index3的列表中的元素还未检测完,则继续进行步骤C6-C7;
此处为图2中的判断步:待测文件第index1行开始与样本文件第index2行开始是否存在连续相似行;以及判断后的2中情况的描述。若当前文本未遍历完,即index3的列表中的元素还未检测完,则继续进行步骤C6-C7。
这样循环进行步骤C6-C7,就可以将index1所标识的行与index3标识的列表中的所有行都进行了相似性对比。
C8、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,循环进行步骤C5-C8;
此步为图2中的判断步,文件夹中是否还有未检测的文件,即是否所有的文件都与index1所标识的行对比完毕。
这样循环进行步骤C5-C8;就可以将index1所标识的行与文件夹中所有文件对应的列表中的所有行都进行了相似性对比。
C9、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;
在步骤C9中重置index1的值后,继续循环进行步骤C3-C9。
算法C的主要思路,可以通过图2来描述,可以参考图2来理解算法3中的描述。
从以上的算法描述上来看,这3个算法中有重复功能,而在应用本方法进行软件编程时,可以将重复功能封装成函数,在需要的地方进行调用,从而减少重复代码,提高代码复用度。
在上述算法中,核心部分为相似性检测算法,根据不同的检测标准调用不同的子算法,具体来说,相似性检测算法分为以下几种情况:
1)如果相似性检测标准要求完全相等,则直接将分别以index1和index2开始的若干连续代码行进行比较是否精确相等,若精确相等则认为符合标准,否则认为不符合;
2)如果要求两段代码中变量名具有一定的重合度或相似性,并以此作为代码相似性标准,则需要首先提取类名、函数名、变量名等标识符以及运算符,并统计各自出现的频率,将结果按标识符和运算符出现频率从高到低进行排序。如果标识符、运算符及其频率分布达到一定相似性要求,则认为两段代码相似。本发明使用正则表达式进行提取标识符,主要分为以下几种情况:
类定义格式为:class类名[(基类名列表)]:,即,类名前有关键字class,其后可能存在使用圆括弧包含的基类名列表,然后是一个英文冒号。因此提取类名可以使用正则表达式’(?<=class\s)\w+(?=:)’。
函数定义格式为:def函数名([参数名列表]):,即,函数名前有关键def,其后为一对圆括弧,圆括弧内可能存在参数名列表,然后是一个英文冒号,有的函数不需要参数,但是一对圆括号必须要有,如果有多个参数则使用逗号分隔开。使用’(?<=def\s)(\w+)\((.*?)\)(?=:)’进行匹配后,group1即为函数名,group2即为参数列表。
变量名的情况比较复杂一些,需要分成以下几种情况分别对待:
普通变量:在Python中变量不需要事先声明,且为动态类型,当为变量名赋值时若变量不存在则直接创建该变量,也就是说,在Python中“=”即既可以用来为变量赋值,又可以用来创建变量。在本发明中不对这两种情况进行区分,而是直接“=”运算符左边的变量名,并统计不同变量名出现频率;使用正则表达式’\b(.*?)(?=\s=)’即可提取变量名或变量名列表(例如a,b=3,5这样的情况),根据需要再使用逗号进行分割以得到所有变量名。
函数参数:函数参数有实参和形参两种情况,实参可能为常数、普通变量、函数调用表达式以及这几种情况的任意组合,本发明中暂时不考虑函数实参;函数形参在提取函数名的同时使用正则表达式一起提取;
for循环内定义的临时变量:for循环内定义的变量特点为,前面是关键字for,然后是变量列表,接下来是关键字in。这里需要注意的是,由于Python序列解包功能,for循环内可以同时定义多个临时变量,如果需要提取每个变量,则需要对使用正则表达式提取的变量列表进行分割。使用正则表达式’(?<=for\s)(.*?)(?=\sin)’即可提取for循环内定义的临时变量或变量列表,根据需要再使用逗号进行分割得到所有变量名。
依照上述方法,同样可以使用正则表达式提取出程序中所有运算符。
提取出两段代码或两个源文件中所有标识符和运算符以后,分类并按出现频率从高到低排序,如果两段代码中标识符与运算符以及频率分布具有较高相似性,则认为两段代码相似。即如果
同时
则认为两段代码具有较高相似性。
杂项:在检测代码重合度或相似度时,应忽略注释而只考虑代码,对于Python语言源文件,除了以“#”开始的为注释行,注释还有两种形式:即包含在一对“″′”或一对“″″″”之间的单行或多行注释。根据这个特点,本发明中,注释判断算法如下:如果当前行以“#”开始,则判断为注释行直接跳过;如果当前行以“″′”或“″″″”开始,则继续判断后面的连续多行,直至遇到以“″′”或“″″″”结尾的行,并返回注释的行数。
程序员在复制代码时,可能会对代码进行重新组织,例如把一行代码拆分成几行来写,并且每次拆分的位置不同,这样以来,如果进行逐行比较的话则不会认为是相同的代码。为了防止由于这种情况引入的误差,结合Python源文件代码规范要求,本发明采用了这样的方法:将以“\”结尾的连续多行代码连接成一个字符串,并删除多余的空格,然后再比较,如果两个长字符串相同,则认为两段连续的多行代码相同。
实现与验证:
本发明所有算法全部使用Python 2.7.8进行实现并验证了其有效性。作为本发明实验验证内容的一部分,选择了Python标准库以及第三方扩展库的大量源文件进行检测,发现即使是标准库和比较成熟的扩展库中也同样存在大量的重复代码。这说明在软件开发过程中,确实存在大量的代码复制或复制后进行较小改动以实现相似功能的情况。部分实验结果如表1(相似度=100%)和表2(相似度=90%)所示。对于单文件的相似性检测,本发明的算法实现代码都能在数秒内运行完成并给出结果,对于较小的urllib.py(57KB)运行时间为2秒,对于较大的文件decimal.py(216KB)运行时间约为120秒左右,都在可接受的范围之内。
表1 Python标准库代码相似性检测结果(相似度=100%)
表2 Python标准库代码相似性检测结果(相似度=90%)
作为本发明实验验证内容的另一重要部分,对Python 2.7.8自带的模块文件之间的相似性做了检测,部分结果如表3(相似度=100%)和表4(相似度=90%)所示。从整体检测结果上来看,Python 2.7.8的大部分标准库文件设计的还是非常好的,像doctest.py、difflib.py等文件与其他标准库文件相似度非常小,几乎可以忽略。
表3 不同文件之间相似性检测部分结果(相似度=100%)
表4 不同文件之间相似性检测部分结果(相似度=90%)
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (2)
1.一种Python源代码文件相似性检测方法,其特征在于,包括以下步骤:
S1、获取用户输入的参数类型;
S2、若判断出所述用户输入的参数类型为一个Python源文件,则应用算法A检测所述Python源文件内代码之间的相似性;
S3、若判断出所述用户输入的参数类型为一个包含Python源文件的文件夹,则应用算法B检测所述文件夹中所有Python源文件之间的相似性;
S4、若判断出所述用户输入的参数类型为一个目标Python源文件和一个包含Python源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文件夹中所有Python源文件之间的相似性;
其中,用来检测同一个Python源文件内代码之间相似性的算法A为:
A1、将用户输入的所述Python源文件中的所有行读入列表;对所有读入内容进行预处理,删除读入内容中所有多余的空格、每行两端的空格以及行尾的换行符;
所述多余的空格即2个相邻标识符或运算符之间最多只保留一个空格,其他空格都是多余的空格;
A2、从0开始依次为列表中每个元素标号,令index1=0;进行步骤A3-A9;
A3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;所述当前行为标号index1所标识的行;
A4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;将当前行与该当前行之前的代码行进行比较,如果符合相似性检测标准则判断当前行为相似行;通过查询Result字典获取该信息,实现快速判断;
A5、遍历列表中index1之后的剩余元素,令index2=index1+1,进行步骤A6-A8;
A6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;此处的当前行为标号index2所标识的行;
A7、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
A8、对比分别以标号index1和标号index2开始的若干连续行的相似性,如果符合相似性检测标准,则将相似性结果更新到Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则将index2增加1行;
当index2小于等于列表中最后一个元素编号时,继续进行步骤A6-A8;
A9、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;
在步骤A9中重置index1的值后,当index1小于等于列表中最后一个元素编号时,继续循环进行步骤A3-A9;
用来检测同一个文件夹中所有Python源文件之间相似性的算法B为:
B1、将所述用户输入的文件夹中所有Python源文件内容读入至列表allFiles,列表allFiles的每个元素是一个列表,每个列表中的第0个元素为文件名,第1个元素是包含该文件的所有代码行;同时对读取的所有内容进行预处理,删除读取的所有内容中的所有多余的空格、每行两端的空格以及行尾的换行符;
B2、从0开始,依次为列表allFiles中各个列表元素标号,令index0=0;进行步骤B3-B13;
B3、从0开始依次为标号为index0的列表中的元素标号,令index1=0;进行步骤B4-B12;
B4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
B5、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
B6、选择标号为index3的列表,其中,index3=index0+1;进行步骤B7-B11;
B7、从0开始依次为标号为index3的列表中的元素标号,令index2=0;进行步骤B8-B10;
B8、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
B9、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
B10、对比以index1和index2开始的若干连续行相似性,如果符合相似性检测标准,则更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则将index2增加1行;当index2小于等于编号为index3的列表最后一个元素编号时,继续进行步骤B8-B10;
B11、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,继续进行步骤B7-B11;
B12、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;当index1小于等于index0的列表中的最后一个元素编号时,进行步骤B4-B12;
B13、将index0增加1;当index0小于等于allFiles列表中最后一个元素编号时,循环进行步骤B3-B13;
所述目标Python源文件与所述目标文件夹中所有Python源文件之间相似性的算法C为:
C1、将所述用户输入的目标文件夹中所有Python源文件内容读入至目标列表allFiles,目标列表allFiles的每个元素是一个列表,该列表的第0个元素为文件名,第1个元素是包含该文件的所有代码行;同时将所述用户输入的目标Python源文件内容读入至目标列表currentFile;对所有读入内容进行预处理,删除文件中所有多余的空格、每行两端的空格以及行尾的换行符;
C2、从0开始依次为目标列表currentFile中的元素标号,令index1=0;进行步骤C3-C9;
C3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
C4、从0开始,依次为列表allFiles中各个列表标号,令index3=0;进行步骤C5-C8;
C5、从0开始依次为标号为index3的列表中的元素标号,令index2=0;进行步骤C6-C7;
C6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;
C7、对比以index1和index2开始的若干连续行相似性,如果符合相似性检测标准,则更新Result字典,并将index2增加符合相似性检测标准的连续行的步长;否则index2增加1;若index3的列表中的元素还未检测完,则继续进行步骤C6-C7;
C8、将index3增加1,当index3小于等于allFiles列表中最后一个元素编号时,循环进行步骤C5-C8;
C9、读取Result字典,获取index1行的最大相似跨度,并将index1增加最大相似跨度的步长;若当前行无相似行,则将index1增加1;
在步骤C9中重置index1的值后,当index1小于等于currentFile列表中最后一个元素编号时,继续循环进行步骤C3-C9。
2.根据权利要求1所述的方法,其特征在于,
所述相似性检测标准为:要求完全相等,则直接将分别以index1和index2开始的若干连续代码行进行比较是否精确相等,若精确相等则认为符合相似性检测标准标准,否则认为不符合;
或者,所述相似性检测标准为:要求两段代码中变量名和运算符具有一定重合度或相似性,则需要首先提取类名、函数名、变量名等标识符以及运算符,并统计各自出现的频率,将结果按标识符出现频率从高到低进行排序;如果标识符与运算符名称以及频率分布达到预设标准,则认为两段代码相似,符合相似性检测标准标准,否则认为不符合。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510014906.3A CN104598231B (zh) | 2015-01-09 | 2015-01-09 | Python源代码文件相似性检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510014906.3A CN104598231B (zh) | 2015-01-09 | 2015-01-09 | Python源代码文件相似性检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104598231A true CN104598231A (zh) | 2015-05-06 |
CN104598231B CN104598231B (zh) | 2018-07-20 |
Family
ID=53124051
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510014906.3A Expired - Fee Related CN104598231B (zh) | 2015-01-09 | 2015-01-09 | Python源代码文件相似性检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104598231B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104954133A (zh) * | 2015-05-07 | 2015-09-30 | 深圳市共进电子股份有限公司 | 证书写入校验方法及装置 |
CN106844306A (zh) * | 2016-12-30 | 2017-06-13 | 江苏天联信息科技发展有限公司 | 文件比较方法及装置 |
CN106844305A (zh) * | 2016-12-30 | 2017-06-13 | 上海帝联信息科技股份有限公司 | 文件中的数据行比较方法及装置 |
CN108932192A (zh) * | 2017-05-22 | 2018-12-04 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
CN109684437A (zh) * | 2018-11-16 | 2019-04-26 | 东软集团股份有限公司 | 用于文件比较的内容对齐方法、装置、存储介质和设备 |
CN109976830A (zh) * | 2019-03-18 | 2019-07-05 | 平安普惠企业管理有限公司 | 配置文件的比对方法及装置、计算机存储介质、电子设备 |
CN110442847A (zh) * | 2019-07-26 | 2019-11-12 | 南京邮电大学 | 基于代码仓库过程管理的代码相似性检测方法及装置 |
CN110457527A (zh) * | 2019-08-16 | 2019-11-15 | 安徽航天信息有限公司 | 一种xml报文比对方法及系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315599A (zh) * | 2007-05-29 | 2008-12-03 | 北京航空航天大学 | 源程序相似度检测方法及装置 |
CN101464898A (zh) * | 2009-01-12 | 2009-06-24 | 腾讯科技(深圳)有限公司 | 一种提取文本主题词的方法 |
CN101697121A (zh) * | 2009-10-26 | 2010-04-21 | 哈尔滨工业大学 | 一种基于程序源代码语义分析的代码相似度检测方法 |
CN101976318A (zh) * | 2010-11-15 | 2011-02-16 | 北京理工大学 | 一种基于数字指纹的代码相似度检测方法 |
US20120159434A1 (en) * | 2010-12-20 | 2012-06-21 | Microsoft Corporation | Code clone notification and architectural change visualization |
CN102982292A (zh) * | 2012-11-05 | 2013-03-20 | 北京奇虎科技有限公司 | 获取可信文件数字签名的方法和装置及系统 |
CN103678528A (zh) * | 2013-12-03 | 2014-03-26 | 北京建筑大学 | 基于段落抄袭检测的电子作业反抄袭系统和方法 |
CN104077147A (zh) * | 2014-07-11 | 2014-10-01 | 东南大学 | 一种基于代码克隆自动检测和及时提醒的软件复用方法 |
-
2015
- 2015-01-09 CN CN201510014906.3A patent/CN104598231B/zh not_active Expired - Fee Related
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101315599A (zh) * | 2007-05-29 | 2008-12-03 | 北京航空航天大学 | 源程序相似度检测方法及装置 |
CN101464898A (zh) * | 2009-01-12 | 2009-06-24 | 腾讯科技(深圳)有限公司 | 一种提取文本主题词的方法 |
CN101697121A (zh) * | 2009-10-26 | 2010-04-21 | 哈尔滨工业大学 | 一种基于程序源代码语义分析的代码相似度检测方法 |
CN101976318A (zh) * | 2010-11-15 | 2011-02-16 | 北京理工大学 | 一种基于数字指纹的代码相似度检测方法 |
US20120159434A1 (en) * | 2010-12-20 | 2012-06-21 | Microsoft Corporation | Code clone notification and architectural change visualization |
CN102982292A (zh) * | 2012-11-05 | 2013-03-20 | 北京奇虎科技有限公司 | 获取可信文件数字签名的方法和装置及系统 |
CN103678528A (zh) * | 2013-12-03 | 2014-03-26 | 北京建筑大学 | 基于段落抄袭检测的电子作业反抄袭系统和方法 |
CN104077147A (zh) * | 2014-07-11 | 2014-10-01 | 东南大学 | 一种基于代码克隆自动检测和及时提醒的软件复用方法 |
Non-Patent Citations (3)
Title |
---|
DUCASSE S ETAL.: "《A Language Independent Approach for Detecting Duplicated Code》", 《IEEE INTERNATIONAL CONFERENCE ON SOFTWARE MAINTENANCE》 * |
史庆庆: "《克隆代码技术研究综述》", 《计算机应用研究》 * |
叶青青: "《软件系统中代码克隆的检测技术》", 《计算机系统应用》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104954133A (zh) * | 2015-05-07 | 2015-09-30 | 深圳市共进电子股份有限公司 | 证书写入校验方法及装置 |
CN106844306A (zh) * | 2016-12-30 | 2017-06-13 | 江苏天联信息科技发展有限公司 | 文件比较方法及装置 |
CN106844305A (zh) * | 2016-12-30 | 2017-06-13 | 上海帝联信息科技股份有限公司 | 文件中的数据行比较方法及装置 |
CN108932192A (zh) * | 2017-05-22 | 2018-12-04 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
CN108932192B (zh) * | 2017-05-22 | 2020-01-14 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
CN109684437A (zh) * | 2018-11-16 | 2019-04-26 | 东软集团股份有限公司 | 用于文件比较的内容对齐方法、装置、存储介质和设备 |
CN109976830A (zh) * | 2019-03-18 | 2019-07-05 | 平安普惠企业管理有限公司 | 配置文件的比对方法及装置、计算机存储介质、电子设备 |
CN110442847A (zh) * | 2019-07-26 | 2019-11-12 | 南京邮电大学 | 基于代码仓库过程管理的代码相似性检测方法及装置 |
CN110457527A (zh) * | 2019-08-16 | 2019-11-15 | 安徽航天信息有限公司 | 一种xml报文比对方法及系统 |
CN110457527B (zh) * | 2019-08-16 | 2023-02-28 | 安徽航天信息有限公司 | 一种xml报文比对方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN104598231B (zh) | 2018-07-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104598231A (zh) | Python源代码文件相似性检测方法 | |
CN109063421B (zh) | 一种开源许可证合规性分析与冲突性检测方法 | |
CN106445476B (zh) | 一种代码变更信息确定方法、装置及电子设备 | |
US8495586B2 (en) | Software for filtering the results of a software source code comparison | |
CN110109681B (zh) | 不同平台间代码的转换方法及系统 | |
CN102012857B (zh) | 一种对Web页面进行自动化测试的装置及方法 | |
CN105302786B (zh) | 数据的编辑方法和装置 | |
CN107783766A (zh) | 对应用程序的文件进行清理的方法和装置 | |
CN111506342A (zh) | 版本差异检测方法、装置、电子设备及存储介质 | |
CN110019038A (zh) | 文件引用分析方法、装置、设备及计算机可读存储介质 | |
JP2007128450A (ja) | ソフトウェア再利用部品管理システム | |
CN112434250B (zh) | 一种基于在线网站的cms识别特征规则提取方法 | |
JP2008310815A (ja) | 検索結果提供方法及びシステム | |
CN108460116B (zh) | 搜索方法、装置、计算机设备、存储介质及搜索系统 | |
CN111722998A (zh) | 代码的质量控制方法、系统、设备及存储介质 | |
CN109918343A (zh) | 一种自动生成ralf文件的方法及系统 | |
JP2010272006A (ja) | 関係抽出装置、関係抽出方法、及びプログラム | |
CN112765041B (zh) | 游戏自动化测试方法、装置及电子设备 | |
CN110543456B (zh) | 一种oasis文件快速读取方法、装置及计算机可读存储介质 | |
CN110309315B (zh) | 模板文件的生成方法、装置、计算机可读介质及电子设备 | |
CN113435217A (zh) | 语言测试处理方法、装置及电子设备 | |
CN110245333A (zh) | 字体类型检测方法、装置、电子设备及存储介质 | |
CN104809036B (zh) | 修复路由器固件漏洞的方法和系统 | |
JP2910662B2 (ja) | 回路接続情報の比較装置 | |
EP1072986A2 (en) | System and method for extracting data from semi-structured text |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180720 Termination date: 20190109 |
|
CF01 | Termination of patent right due to non-payment of annual fee |