Python源代码文件相似性检测方法

文档序号:8269745阅读:1036来源:国知局
Python源代码文件相似性检测方法
【技术领域】
[0001] 本发明涉及计算机技术领域,尤其涉及一种Python源代码文件相似性检测方法。
【背景技术】
[0002] 目前,由于互联网的快速发展和开源社区的普及,很多程序员已经很少自己独立 完成编写代码的工作,更多的是从网上搜索并复制相关功能代码,然后将大量代码拼凑起 来实现自己的功能,尤其对于非核心的外围代码更是如此。在软件编程过程中,源代码的复 制和粘贴是非常频繁的操作,尤其是设计不够好的软件开发中或者水平较低的程序员编写 代码的过程中,代码的低级复用较多,这种情况更为常见。借鉴优秀的代码固然能够缩短开 发周期,提高开发效率,但不幸的是,很多程序员并不对复制来的代码进行安全性和功能性 检查,只要实现功能满足当前的需求即可。这样会使得自己的软件产品中可能存在无用功 能代码,这些无用功能可能会成为黑客攻击的突破口。更重要的是,原始代码被发现安全漏 洞以后很难保证所有的使用者都能清楚地知道并对代码做出正确的修改。如果有一天某块 代码被发现存在bug,而该代码块又被复制过很多次,那么就需要检查所有的相同代码进行 正确的修改,如果有漏掉的代码块,则存在一个潜在的漏掉而使得整个软件不安全,即"木 桶原则"。

【发明内容】

[0003] 本发明实施例提供了一种Python源代码文件相似性检测方法,可以准确检测出 相同或相似的源代码。
[0004] 本发明实施例提供了一种Python源代码文件相似性检测方法,包括以下步骤:
[0005] 一种Python源代码文件相似性检测方法,其特征在于,包括以下步骤:
[0006] S1、获取用户输入的参数类型;
[0007] S2、若判断出所述用户输入文件的参数类型为一个Python源文件,则应用算法A 检测所述Python源文件内代码之间的相似性;
[0008] S3、若判断出所述用户输入文件的参数类型为一个包含Python源文件的文件夹, 则应用算法B检测所述文件夹中所有Python源文件之间的相似性;
[0009] S4、若判断出所述用户输入文件的参数类型为一个目标Python源文件和一个包 含Python源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文 件夹中所有Python源文件之间的相似性。
[0010] 具体的算法A、B、C在具体实施例中进行说明。
[0011] 本发明的有益效果:本申请提供的方法,在进行相似相检测时先对读取文件内容 并进行预处理,将内容重新格式化,过滤干扰因素,然后根据指定的相似性标准对代码进行 比对,在比对时忽略注释行,采用逐行迭加的方式消除代码布局不同的影响,提高判断精 度,减少误差。本发明支持Python源文件代码的精确匹配和模糊匹配,支持两种不同精度 要求的代码相似性检测,支持不同布局代码之间的相似性检测。本发明稍加修改同样适用 于其他语言源代码相似性检测,并且可以根据需要增加其他相似性判断标准,具有很好的 可扩展性。
【附图说明】
[0012] 图1本发明实施例提供的一种Python源代码文件相似性检测方法的流程示意 图;
[0013] 图2本发明实施例提供的一种算法C的流程示意图。
【具体实施方式】
[0014] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本发明保护的范围。
[0015] 本发明提供的方法可以接受不同的使用方式:1)如果输入一个Python源文件则 自动检测该文件中代码块之间的相似性;2)如果输入一个文件夹则可以检测该文件夹中 所有Python源代码文件之间的相似性;3)如果输入一个文件和一个文件夹则自动检测该 文件与文件夹中所有Python源文件的相似性。本方法的检测结果为相似行的起始行号以 及相似代码行数。可以检测不同行数代码的相似性,可以针对同一段代码检测不同跨度的 相似性,返回结果为不同位置与原始代码的最大相似度(即相似的代码行数)。本方法还 允许指定精度参数,可以支持不同精确率的相似性检测,支持模糊匹配,给用户较大的自由 度。
[0016] 本方法存储的相似性检测结果用到的主要数据结构是Python字典,Result,其中 每个条目的键表示原始行号,值为一个列表,列表中的元素仍为列表,其中每个元素分别表 示重复的文件名、行号和行数:
[0017] {originl:[[filel, startll, spanll], [filel, startl2, spanl2], [file2, startl3, spanl3]],
[0018] origin2 : [ [filel,start21,span21],[file3, start22, span22],...]],
[0019] origin3 : [ [file5, start31,span31],…],
[0020] …}
[0021] 以其中条目2为例,表示目标文件中从origin2开始的span21行与filel中 start21开始的span21行相似,目标文件中从origin2开始的span22行与file3中 start22开始的span22行相似,其他以此类推。
[0022] 本发明实施例提供了一种Python源代码文件相似性检测方法,所述方法包括以 下步骤:
[0023] S1、获取用户输入的参数类型。
[0024] S2、若判断出所述用户输入文件的参数类型为一个Python源文件,则应用算法A 检测所述Python源文件内代码之间的相似性。
[0025] S3、若判断出所述用户输入文件的参数类型为一个包含Python源文件的文件夹, 则应用算法B检测所述文件夹中所有Python源文件之间的相似性。
[0026] S4、若判断出所述用户输入文件的参数类型为一个目标Python源文件和一个包 含Python源文件的目标文件夹,则应用算法C检测所述目标Python源文件与所述目标文 件夹中所有Python源文件之间的相似性。
[0027] 其中,用来检测同一个Python源文件内代码之间相似性的算法A为:
[0028] A1、将用户输入的所述Python源文件中的所有行读入列表;对所有读入内容进行 预处理,删除读入内容中所有多余的空格、每行两端的空格以及行尾的换行符;
[0029] 所述Python源文件中每一行,读入列表中为所述列表中一个元素。
[0030] 所述多余的空格即2个相邻标识符或运算符之间最多只保留一个空格,其他空格 都是多余的空格,需要删除。
[0031] A2、从0开始依次为每个元素标号,令indexl = 0 ;进行步骤A3-A9 ;
[0032] A3、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;所述当 前行为标号indexl所标识的行;
[0033] 对于Python语言源文件,除了以"#"开始的为注释行,注释还有另外两种形式:即 包含在一对^ "或一对"""""之间的单行或多行注释。根据这个特点,本发明中,注 释判断算法如下:如果当前行以"#"开始,则判断为注释行直接跳过;如果当前行以^ " 或"""""开始,则继续判断后面的连续多行,直至遇到以"或"""""结尾的行, 并返回注释的行数。
[0034] 注释行不需要被比较相似性,故跳过所有注释行。
[0035] 示例的,假设第0-5行为注释行,如果当前行为第0行,且第0行被判断为注释行, 则可以跳过从第0行开始的所有6行注释行,即跳过第0-5行。
[0036] A4、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
[0037] 这里的相似性比较是通过查询Result字典获取信息,目的是为了加快速度,避免 重复的相似性比较。
[0038] 示例的,假设第0-5行为代码行,且0-5行与50-55行代码相似,则当当前行为50 行时,可以判断出当前行为相似行,则跳过从第50行开始的所有6行连续相似行;即跳过第 50-55 行。
[0039] 当然,在初始indexl = 0时,当前行为第0行,当前行没有代码行进行对比,不是 相似行。
[0040] A5、遍历列表中indexl之后的剩余元素,令index2 = indexl+Ι,进行步骤A6-A8 ;
[0041] 假设,初始时,第0行即不是注释行也不是代码行,则列表中未被判断过或跳过的 剩余元素即为第1行以及第1行之后的所有行,此时,index2 = 1。
[0042] A6、如果当前行被判断为注释行,则跳过从当前行开始的所有连续注释行;此处的 当前行为标号index2所标识的行;
[0043] A7、如果当前行已被判断为相似行,则跳过该行开始的所有连续相似行;
[0044] A8、对比以标号indexl和标号index2开始的若干连续行的相似性,如果符合相似 性检测标准,则将相似性结果更新到Result字典,并将index2增加符合相似性检测标准的 连续行的步长;否则将inde X2增加1 ;
[0045] 当index2小于等于列表中最后一个元素编号时,继续进行步骤A6-A8 ;
[0046] 这样循环进行步骤A6-A8,就可以将indexl所标识开始的连续行与剩余元素的行 都进行了相似性对比。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1