CN105426711A - 一种计算机软件源代码相似度检测方法 - Google Patents

一种计算机软件源代码相似度检测方法 Download PDF

Info

Publication number
CN105426711A
CN105426711A CN201510794525.1A CN201510794525A CN105426711A CN 105426711 A CN105426711 A CN 105426711A CN 201510794525 A CN201510794525 A CN 201510794525A CN 105426711 A CN105426711 A CN 105426711A
Authority
CN
China
Prior art keywords
code
token
block
code block
diversity factor
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
Application number
CN201510794525.1A
Other languages
English (en)
Other versions
CN105426711B (zh
Inventor
嵩天
田星
李凤霞
刘政祎
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BEIJING MULTI-CODE EDUCATION TECHNOLOGY CO., LTD.
Original Assignee
Beijing Institute of Technology BIT
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Institute of Technology BIT filed Critical Beijing Institute of Technology BIT
Priority to CN201510794525.1A priority Critical patent/CN105426711B/zh
Publication of CN105426711A publication Critical patent/CN105426711A/zh
Application granted granted Critical
Publication of CN105426711B publication Critical patent/CN105426711B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/16Program or content traceability, e.g. by watermarking

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Machine Translation (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及一种计算机软件源代码相似度检测方法,属于计算机应用技术领域,该方法包括如下步骤:首先依据编程语言不同,对源代码进行分词操作,然后选择特定标注词对分词结果进行分块处理,依据变量属性对变量分词进行相关处理;而后基于分块结果对各块进行差异测算操作,得到差异矩阵,依据各块差异结果及相关性,得到整体差异;进而根据公式最终得到代码相似度检测结果。对比现有技术,本发明方法能够比较成功的识别代码相似度检测中遇到的逐字拷贝、更改注释语句空白区域、重命名标识符、更改数据类型等手段,能够成功检测改变代码块顺序、改变语句顺序、增加冗余语句和变量以及用等价的控制结构替换原有控制结构等手段。

Description

一种计算机软件源代码相似度检测方法
技术领域:
本发明涉及一种计算机程序分析技术和计算机软件的代码相似度检测算法,特别涉及一种基于源代码分词分块提取处理及多种差异测量方法可扩展的代码相似度检测算法,属于计算机应用技术领域。
背景技术
代码相似度检测技术目前最主要应用于代码的剽窃检测上,是计算机软件开发和维护活动中一项重要任务,在源代码剽窃检测、软件组件库查询、软件缺陷检测、程序理解等多个领域中有广泛应用。其不仅可以帮助教师检测学生的程序作业抄袭情况,同时对软件版权的鉴定也具有好的现实意义。
在发表于第六届北美大学计算科学协会年会论文集“抄袭检测度量元”(Metricsbasedplagiarismmonitoring.Paperpresentedatthe6thAnnualCCSCNortheasternConference,MiddleburyVT.2001)一文中,琼斯(Jones)总结了十种剽窃手段。分别为(1)逐字拷贝(2)更改注释语句(3)更改空白区域(4)重新命名标识符(5)改变代码块的顺序(6)改变代码块中语句的顺序(7)改变表达式中操作符和操作数的顺序(8)更改数据类型(9)增加冗余的语句和变量(10)用等价的控制结构替换原有控制结构。
从国内外的研究现状可以发现,国内在对程序相似度判别研究相对较少,大部分集中在对中文分词和语义的研究上。可以参考的工具有:北航高级程序课程教学辅助平台中用于检测学生提交程序作业是否抄袭的BUAASIM系统等。
国外目前已有许多软件工具可用来检测源程序是否抄袭,如美国斯坦福大学的MOSS系统、威奇塔州立大学的SIM系统、伊利诺伊大学的GPLAG系统、德国Karlsruhe大学的JPlag系统和澳大利亚悉尼大学的YAP3系统。目前最主要的代码相似度检测技术主要分为两大类,属性计数技术及结构度量技术,包含如下几种具体的方法:Textualcomparison,Tokencomparison,Metriccomparison,Comparisonofabstractsyntaxtrees(AST,抽象语法树),Comparisonofprogramdependencygraphs(PDG,程序依赖图)及其他相关方法。
而在实际使用及研究中发现,目前主要流行的上述几种方法各自存在其不同的缺陷。两种token-based的方法和text-based的方法效果一般且相差不大。AST-based的方法效果表现很好,但算法流程复杂,难于实现且执行时间长,且对于不同语言的匹配实现算法改动较大,PDG-based的方法表现性能不佳。另有文章指出,上述五种方法均拒绝了大量真正的相似代码,且其对于注入代码等某些特殊情况检测率低。
综上,目前主流的代码相似度检测方法普遍存在检测效果低、部分方法复杂执行时间长、某些情况错误率高以及难于应用在不同编程语言上等问题。
发明内容
本发明的目的是为解决在检测代码相似度过程中遇到的检测效果低、部分方法复杂执行时间长、某些情况错误率高以及难于应用在不同编程语言上等问题,提出了一种计算机软件源代码相似度检测方法,该方法基于源代码分词处理和分块分析比较差异获得代码相似度检测结果。应用该方法,可以在低内存短执行时间的前提下,显著提升代码相似度检测结果准确度,并大幅度降低代码检测最短代码长度限制。
本发明方法的思想是,首先依据编程语言不同,对源代码进行分词操作,然后选择特定标注词对分词结果进行分块处理,依据变量属性对变量分词进行相关处理;而后基于分块结果对各块进行差异测算操作,得到差异矩阵,依据各块差异结果及相关性,得到整体差异;从而最终得到代码相似度检测结果。
一种基于源代码分词分块提取处理及多种差异测量方法可扩展的代码相似度检测方法,包括以下步骤:
步骤1,将两份代码文件,依据其编程语言编译原理进行分词操作,得到分词结果集合tokens;
步骤2,对两份代码tokens分别对以特定token起始的语法代码块结构,得到其各自分块结果blocks;
步骤3,对blocks中的变量类型token进行标记,统计其在全部代码中出现的次数和来自的block;
步骤4,采用差异度计算方法计算代码文件A中块与代码文件B中块的差异度,最终得到一个差异度矩阵
步骤5,依据两份代码其各块的差异度关系,以及相似代码块间差异度最小原则制定相应规则,选择差异度矩阵中的某些元素或用某些代码块全部token个数作为部分差异度,对其进行求和,得到两份代码整体差异度;
步骤6,依据两份代码整体差异度和两份代码总体token个数进行计算,得到差异代码占代码总体的比例,进而得到两份代码相似度结果。
最终相似度结果为一个在[0,1]区间的实数,0表示非常不相似,1表示非常相似。
作为优选,步骤1所述分词操作通过以下过程完成:
首先,对代码文件,依据其所属编程语言词法规则进行初步分词,得到由若干分词结果(token)组成的集合tokens;
其次,对初步分词结果进行再处理,删除注释或物理空行,并将预先设定的代码块起始关键字token类型改为新的BLOCKNAME类型,其他关键字保持原关键字类型不变。
作为优选,所述预先设定的代码块起始关键字为循环代码块、判断代码块、函数代码块、类代码块、异常(try)代码块、with代码块以及全局代码块的起始关键字。
作为优选,步骤2所述进行token分块操作时对于某些起始关键字开始的块,根据语言语法规则设定块相关性,对具有相关性的连续块合并成一个代码块。
作为优选,所述进行token分块操作时对于仅包含一条语句的代码块不作为一个单独的块。
作为优选,步骤2所述对blocks中变量类型token进行标记,标记方法为将该token写为三元组形式[value,-1*次数,blockname],其中value表示该token的字符串原文,次数表示该token出现的次数,blockname表示该token来自于哪个块,如果是全局块以'global'表示,如果是其它块以其对应块的起始关键字表示。
作为优选,步骤4所述差异度计算方法为如下一种改进的编辑距离算法:
(1)查找代码块A、B的最长连续公共token子序列;
(2)如果该序列长度小于预设的最小语句长度MIN,则转到步骤(3);否则,用一个不同于已有token的新的token替换代码块A、B的最长连续公共token子序列,然后返回步骤(1);
(3)以传统的编辑距离算法计算代码块A、B的差异度。
作为优选,判断所述变量类型token相同的标准如下:
(1)如果两个token的名称相同,则视为相同;
(2)如果名称不同,但在两份代码中出现次数相同或相近且较大,则视为相同;
(3)如果名称不同,但在两份代码中出现次数相同或相近且较小,且所属块相同,则视为相同。
作为优选,步骤5所述依据差异度矩阵以及相似代码块间差异度最小原则制定的相应规则如下:
(1)对差异度矩阵,对于每一行选择不与已选取过值的列相重复的最小值作为该行的差异度;
(2)对于剩余没有被取过值的行或列,选取对应代码文件中代码块的token个数作为该行或列的差异度
作为优选,步骤6所述依据两份代码整体差异度和两份代码总体token个数进行计算,过程如下:
(1)依据如下公式计算初步相似度结果评分Score:
S c o r e = 1 - e d i t D i s ( A , B ) ( ( c a r d ( A ) + c a r d ( B ) ) / 2
其中card(·)表示·中的全部token个数,editDis()表示代码块A、B的整体差异度;
(2)在输出所述Score前,通过以下过程进行修正:如果score大于1,则将score修改为1;如果score小于0,则将score修改为0。
有益效果
对比现有技术,本发明的有益之处在于,本技术能够比较成功的解决代码相似度检测中遇到的逐字拷贝、更改注释语句空白区域、重命名标识符、更改数据类型等手段,并通过使用类似于GST(GreedyStringTiling)字符串匹配算法改写编辑距离算法或其他度量方法,并采用本方法设计实现的分块比较编辑距离方法,使其能够成功检测改变代码块顺序、改变语句顺序、增加冗余语句和变量以及用等价的控制结构替换原有控制结构等手段。
最终得到的结果能够准确体现出相似部分代码占代码整体的百分比。本方法不仅能使用现有的多种编辑距离算法,使用者也可以在本方法思想基础上使用其他差异测算算法,以适应不同场景。
附图说明
图1为算法流程图。
图2为示例代码1。
图3为示例代码2。
图4为代码1转化得到的tokens。
图5为代码2转化得到的tokens。
图6为代码1转化得到修改变量后的分块结果。
图7为代码2转化得到修改变量后的分块结果。
图8为两份示例代码编辑距离矩阵。
具体实施方式
为使发明的目的、技术方案及优点更加清楚,下面将结合附图对本发明的实施例进行详细描述。本实施例以本发明技术方案为前提进行实施,给出了详细实施方式和具体操作过程,但本发明的保护范围不限于下述实施例。
本方法并不仅针对某一种编程语言,此处为便于详细介绍具体实施方式,故选择两份Python语言的程序代码作为示例。
考虑如图2、图3所示两份代码,代码一为原创代码,代码二为相似代码,主要包括以下几种改动方式:(1)逐字拷贝(2)更改注释语句空白区域(3)重命名标识符(4)改变语句顺序(5)改变代码块顺序(6)增加冗余语句和变量(7)等价的控制结构替换原有控制结构;如表1所示。
表1抄袭手段及百分比
下面根据如图1所示算法流程,对如图2、图3所示的2份示例代码进行相似度检测:
步骤1至步骤3均为对两份代码独立进行处理,步骤4-6为将两份代码相关计算结果合在一起进行处理。
步骤1:将两份代码文件,依据其编程语言相关的编译原理进行分词操作,得到分词结果集合tokens;
本步骤是对两份待比较代码进行读取分词处理。本步骤的目的是将原有代码转换为tokens,以供后文进行差异度计算;并将预先设定的代码块起始token与普通关键字token进行分离,以便后文进行分块处理。
读取给定的两份待比较代码源文件,本例中采用如图2、图3所示的两份Python代码源文件进行代码相似度比较。
首先,对代码文件,依据其所属编程语言词法规则进行初步分词,得到由若干分词结果(token)组成的集合tokens。
该分词结果是由分词内容(value)及分词类型(type)构成的二元组(token[value,type]);进一步的,为了便于后续处理中进行比较,可用其类型对应的唯一标号替代。Python代码文件初步分词操作可直接使用ThePythonStandardLibrary中的tokenize模块完成。
其次,对初步分词结果进行再处理,删除注释或物理空行,并将预先设定的代码块起始关键字token类型改为新的BLOCKNAME类型,其他关键字保持原关键字类型不变。
本例中,代码文件初始分词类型参照Python源码Lib/token.py文件。
为下一步进行分块处理而预先设定的代码块为:判断代码块、循环代码块、函数代码块、类代码块、try代码块、with代码块以及全局代码块。故此处选择Python编程语言中的if、for、def、class、while、try和with共7个关键字作为BLOCKNAME类型。全局代码块的起始标志为初步分词结果tokens的第一个token。因此,针对本步骤内容,此处对tokens中的每一个元素token进行如下判断处理:
1.如果其type表示类型为注释或物理空行等,即其在代码实际执行中无意义,则将其从tokens数组中删除;
2.如果其type表示关键字类型,并且其是预先设定的BLOCKNAME中的任意一个,则将该token内容替换为[value,BLOCKNAME];
3.如果是其他情况,则保持原token不变。
以上设定的代码块仅为举例,实际应用过程中可以根据不同语言的特点进行设定。
由于Python语言tokenize模块进行分词后,会将用户自定义变量名、函数名等与全部Python保留关键字作为同一个类型NAME。为便于后文对变量名进行去重复操作,此处需要将用户自定义变量名与Python保留关键字区分开。故设立新的分词类型WORD,用来表示除BLOCKNAME所表示的7个关键字之外的其他保留关键字。用户自定义变量名、函数名均保持原type不变,即仍为NAME类型。
因此,对于Python语言的代码,需在上述判断中额外添加一条判断分支,即:
4.如果其type为NAME,且其是除BLOCKNAME之外的Python保留关键字,则将原token内容替换为[value,WORD]。
至此,对两份待比较代码分词处理完毕。本例中得到的分词结果如图4、图5所示。
本步骤中,使用者可以依据不同编程语言的编译原理,对待检测相似度的程序代码进行分词操作,并不仅限于使用tokenize模块。
分词类型依据编程语言不同而不同,普遍存在的类型如关键字、操作符、界限符等,每个类型均有独一的标号,此标号仅作为标识,不影响后文操作,使用者可自行确定标号。BLOCKNAME依据不同编程语言的语法而确定,并不仅限于上文所述。
另外需要注意的是,为方便后文对变量进行代码块的标记,需要其所属代码块名;全局代码块的起始标志为tokens数组第一个token的value。ThePythonStandardLibrary中的tokenize模块对Python源码进行初步分词操作时,会默认在结果tokens中第一个位置添加一个ENCODING类型token,表示该代码文件所使用的编码方式;其也会在结果tokens中最后一个位置添加一个ENDMARKER类型token,表示该代码文件的结束。如果使用者使用其他分词工具未有类似操作时,可以在步骤1结束后手动添加一个代码文件起始token和一个代码文件结束token。
步骤2:对两份代码的tokens分别以特定token起始的语法代码块结构进行分块操作,得到各自的分块结果blocks;。
本步骤将分词结果tokens作为输入,依据预先设定的BLOCKNAME进行分块处理,得到分块结果blocks。
一般编程语言代码块token可能的结构如下所示:
(1)…[value1,BLOCKNAME],[value2,代码块起始标志类型],…[value3,代码块结束标志类型],…
(2)…[value1,BLOCKNAME],[value2,代码块起始标志类型],…[value3,代码块结束标志类型],[elseif、else、except、finally或其他表示与value1同一判断条件不同分支的关键字类型],[value4,代码块起始标志类型],…[value5,代码块结束标志类型],…
(3)…[value1,BLOCKNAME],[value2,代码块起始标志类型],…[value3,BLOCKNAME],[value4,代码块起始标志类型],…[value5,代码块结束标志类型]…[value6,代码块结束标志类型],…
结构(1)为普通顺序代码块结构;结构(2)为在代码块结尾处有该代码块所属判断条件或其他关系的另一分支代码块结构;结构(3)为在以value1起始BLOCKNAME的代码块中,嵌套有另一以value3为起始BLOCKNAME的代码块。
由于代码块之间可能有并列或嵌套关系,为了明确处理代码之间的嵌套关系,引入代码块替代常量FOLDEDBLOCK,表示一段被提取出去的代码块。
针对上述三种代码块结构的分块操作分别为:
(1)将从[value1,BLOCKNAME]起始至[value3,代码块结束标志类型]结束的若干token划分为一个代码块;
(2)将从[value1,BLOCKNAME]起始至[value5,代码块结束标志类型]结束的若干token划分为一个代码块;
(3)将从[value3,BLOCKNAME]起始至[value5,代码块结束标志类型]结束的若干token划分为一个代码块,将从[value1,BLOCKNAME]起始至[value6,代码块结束标志类型]的若干token划分为一个代码块。
然后用一个token[代码块名,FOLDEDBLOCK],在原tokens数组中替换划分出去的代码块。
针对上述如何划分代码块的内容,本实施例给出如下具体划分过程的详细流程:
首先,设立4个变量:flag,布尔型变量,其初始值为True,若当前已读取到文件结束标志则置为False;pos,整型变量,表示当前代码块在tokens数组中的起始位置;blocks,数组类型变量,用于存储提取出来的代码块结果;stack,数组类型变量,作为栈存储检测到的代码块名及其起始位置index,代码块名(block)初始值为代码块起始关键字,且首字母大写,例如,with关键字的块名为With。处理过程中,通过字母大小写变化表示代码块处理状态,大写字母表示该代码块未处理,小写字母表示当前正在处理,出栈表示处理完成。
然后,设立两层循环,外层为while循环,条件为flag为True时执行循环,为False时退出循环;内层为for循环,数组下标临时变量i从pos起始,依次增长到tokens数组最后一位,每次增长1;外层循环直接嵌套内层循环。
在内层循环中,执行如下判断:
1.如果当前token.type为BLOCKNAME,则执行操作为,获得其代码块名,将元素[代码块名首字母的大写字母,数组当前下标i]入栈;
2.如果当前token.type为代码块起始符号,并且stack中至少存在一个未处理过的block,即stack栈顶block值改为大写,然后执行以下判断:
(1)如果tokens数组当前位置下一位无token,即代码文件结束,表示该代码文件存在语法错误,则执行操作为:返回错值,程序中止;
(2)其他情况,执行操作为,将stack中栈顶block值修改为小写,表示当前正在向该block中添加token,继续执行下一次循环。
上述2个判断条件为并列判断,即if、else关系。
3.如果当前token.type为代码块结束标志,则执行操作为,进行如下判断:
(1)如果当前栈为空,表示该代码文件存在语法错误,则执行操作为,返回错值,程序中止;
(2)如果tokens数组当前位置下一位有token,并且其value值是else、except、finally或elif中的一个或表示与前一代码块BLOCKNAME同一判断条件不同分支的关键字,则执行操作为,执行内层for循环的下一轮,即continue操作;
(3)如果并非上述两种情况,则执行操作为,将stack中栈顶元素,即当前正在处理中的代码块,的index值至当前位置i的全部tokens作为一个block加入blocks数组中,然后将tokens数组中的这部分token用一个[代码块名,FOLDEDBLOCK]替代,pos位置更新为stack栈顶元素index+1,而后将栈顶元素从stack中移出,即出栈操作,然后退出内层for循环,进入最外层while循环继续执行,即break操作。
上述3个判断条件为并列判断,即if、elseif、else关系。
4.如果当前遍历的token类型为ENDMARKER(见步骤1),则表明当前代码文件读取处理完毕,则执行操作为,将当前tokens数组中的所有token作为一个block加入到blocks中,退出全部循环;
5.其他情况,不进行任何操作,进行下一轮循环。
上述5个判断条件为并列判断,即if、elseif、elseif、elseif、else关系。
至此,对tokens分块处理完毕。本步骤中,使用者也可依据不同编程语言、或不同的认知选择不同于本例的起始关键字。
由于Python编程语言中,NEWLINE表示逻辑换行,INDENT表示缩进,两者连接在一起表示,在代码块起始BLOCKNAME后面是一个合法的代码块;DEDENT,表示回退,表示该代码块结束。其正常代码块token结构如下:
…[value1,BLOCKNAME],[value2,NEWLINE],[value3,INDENT],…[value4,DEDENT],…
或…[value1,BLOCKNAME],…
第二种情况主要适用于该代码块仅包含一条语句的情况,故其不需要代码块起始标志类型token与代码块结束标志类型token。本方法中选择将该情况不作为一个独立的代码块进行处理。
依据上述内容对原方法进行改动,具体改动主要在内层循环判断中的第2点中,改动后的第2点如下:
2.如果当前遍历的token的类型为NEWLINE,并且stack中至少存在一个未处理过的block,即stack栈顶元素block值的符号为大写,则执行操作为,进行以下判断:
(1)如果tokens数组当前位置下一位无token,即代码文件结束,表示该代码文件存在语法错误,则执行操作为,返回错值,程序中止;
(2)如果数组下一位token类型为INDENT,执行操作为,将stack中栈顶block值修改为小写,表示当前正在向该block中添加token;
(3)其他情况,执行操作为,将stack栈顶元素出栈,即表示将一行的块作为普通语句,不作为块进行处理;
上述3个判断条件为并列判断,即if、elseif、else关系。
使用者可依据本方法思想,结合具体编程语言token语法,选取不同于本例的起始关键字或对本步骤中内容进行改动。
步骤3:对blocks中的变量类型token进行标记,统计其在全部代码中出现的次数和来自的block;
本步骤是对得到的tokens分组中变量类型的token进行标记。目的是依据该变量的命名、出现次数及其出现位置,唯一确定该变量,以应对变量名替换等问题。因此,结合Python语言的特点,本实施例中将变量类型token改写为三元组形式[value,-1*次数,blockname],其中次数表示该变量在所有token中出现的次数,blockname表示该变量来自于哪个块,如果是全局块以'global'表示,如果是其它块以其对应块的起始关键字表示。此处由于token.type的标号为正值,将三元组第二位设置为负值的意义在于,可使变量类型token出现的次数与token.type的标号相区分。当然,对于变量类型的token的标记,也可根据实际情况采取其它的方式进行标记,只要能够方便识别不同代码中的同一变量即可。
首先,设立一个名为name的字典类型变量,用于存储每一个变量类型token的value及其在步骤1得到的全部tokens中出现的次数(value,count)。执行如下操作:遍历步骤1得到的tokens数组,对于tokens数组中每一个token,如果该token的type为变量类型,则执行如下判断:若该value尚未在name中出现过,则将其value加入字典,并设置其值count=1;若出现过,则依据其value使其对应计数count加1。可通过name[value]获得该value所对应的count值。
另设立一个名为from的字典类型变量,用于存储每一个变量类型token的value及其在步骤2得到的分块blocks结果中,其声明位置所属代码块名(value,fromblock)。可通过from[value]获得该value所对应的fromblock值。
其次,对于步骤2得到的分块blocks,使用双重循环进行遍历,对于每一个block中的每一个token,如果其type为变量类型,则进行如下判断:
1.如果该token所属当前block中,起始token的type表示为该代码文件起始token,则表明该block为全局block,则执行操作,将该位置token改写为[value,-1*name[value],'global'],并将from[value]值置为'global';
2.如果该token所属当前block中,起始token的type为BLOCKNAME,则表示该块为内部代码块,则执行操作,若from[value]值为空,则将该位置token改写为[value,-1*name[value],block[0].value](block[0].value为当前block第一个token的value),并将from[value]值置为block[0].value;若from[value]值非空,则将该位置token改写为[value,-1*name[value],from[value]]。
此处注意,由于Python语言语法特殊性,可以将二元组与三元组同时放置在同一个数组中;如果使用者使用其他语言实现本算法则需自行对该处进行改写。
另外由于Python语言语法特殊性,变量全部为引用,不需要提前进行声明,则本步骤中不需要设立from字典,且在判断中可直接参照from[value]值为空情况进行处理。
至此,对分组后的变量类型token改写完毕。本例得到的分组结果如图6、图7所示。
步骤4:采用差异度计算方法计算代码文件A中的块与代码文件B中的块的差异度,最终得到一个差异度矩阵;
本步骤是对于两份待比较代码A、B,依据步骤3得到的改写变量后的分组结果,计算代码A的每一个代码块对应于代码B的每一个代码块的差异度,以此构成差异度矩阵,维度为M*N,其中,M、N分别表示A、B的代码块数。
在进行变量类型token比较时,设定2个token相同条件如下:
(1)如果token的count值均为负值,且名称,即value相同,则视为相同;
(2)如果名称不同,但出现次数,即count相同(或相近)且绝对值较大,则视为相同;
(3)如果名称不同,但出现次数,即count值相同(或相近)且绝对值较小,且所属块相同,则视为相同,
(4)其他情况视为不同。
使用者也可依据自身在前文中对变量改写时采用不同的改写方法,而在这里使用不同的比较方法。
现有的差异度计算方法很多,都可以用来计算不同代码块之间的差异度。为了获得更好的差异度计算结果,本例中采用一种发明人改进的编辑距离算法。下面对该方法进行解释介绍。
本发明人对编辑距离算法的改进,是通过在待计算差异度的两个代码块中,将所有长度在自设最小长度阈值(MIN)之上的相同连续token序列,替换为一个token[folded,FOLDEDTOKEN],其中folded为标号,从0开始,每替换一次进行加1操作,FOLDEDTOKEN为自设token的type。
该改进方式具体执行流程如下:
在说明流程前,先对其中涉及的符号含义进行说明:设立折叠相同代码块标号folded,初始赋值为0。设定MIN值,本例中设为6,表示两个代码块A、B中最长相同token序列长度。
第1步,查找代码块A、B的最长连续公共token子序列,此方法有多种实现,故此处并不给出具体实现,记录该公共子序列长度为len、代码块A起始位置startA和代码块B起始位置startB;
第2步,判断该子序列长度,若该序列长度小于MIN,则编辑距离算法改进过程结束,不再继续执行;否则执行代码块折叠替换操作,即,用[(folded,FOLDEDTOKEN)]替换代码块a、b中的相同位置tokens,即a[startA:startA+len-1]与b[startB:startB+len-1];
第3步,对folded进行加1操作,然后,跳回到第1步,对更改后的代码块A、B重新进行判断。
至此,对编辑距离算法的改进结束。
下面简要介绍传统的编辑距离算法,编辑距离(EditDistance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
简单来讲,编辑距离算法的输入为两个序列,通过使用者自定义的比较函数进行相关比较,最终可以得到一个整数值,用于表示两个输入序列之间的编辑距离,即差异度。该差异度越小,表示两个序列更相近。
具体计算编辑距离矩阵步骤如下:
第1步,计算两份代码A、B中各自包含的代码块个数为lenA、lenB,建立一个二维数组,editM[lenA][lenB];
第2步,建立双层循环,外层循环遍历blocksA,内层循环遍历blocksB,循环内通过改进后编辑距离算法计算blocksA[i]与blocksB[j]的编辑距离,将其值存储在editM[i][j]中;
第3步,对editM二维数组进行调整,使其列数大于行数。
至此,各代码块间差异度矩阵计算完毕。此步骤得到差异度矩阵如图8所示。
此改进方法主要是针对编辑距离算法中,对代码块替换操作差异度计算高于准确值的问题进行的改进。在通常的编辑距离中,允许的编辑操作包括:插入,删除,替换。但其不能解决如下问题,abcdefgh123456789与123456789abcdefgh的比较。注意到这两个串仅是一个普通的调换,但用传统算法计算出来的距离为16。这是因为编辑操作里没有块(块定义为大于某个阈值长度的子串)的调换,如果采用原值16,则会导致差异度结果远大于准确值。
但如果结合最大公共子序列算法,使用本文的改进方法,则将原串替换为AB和BA,即123456789替换为A,abcdefgh替换为B。此时再使用编辑距离算法,得到距离为2。即可以理解为一次块的调换需要2次操作。
通过将原值由16降低到2,大幅降低了代码块或代码语句调换而带来的过大的差异度问题。此改进方法克服了代码语句位置替换带来的干扰。
需要注意的是,在多次求最大公共子序列时,如果子序列长度小于某个阈值,即停止该步骤,进入求编辑距离阶段;在阈值设置上可选择目标编程语言的常见代码最小语句长度,如对于Python语言代码可将该值设为6,通常来说最小语句为“A=a+b\n”,共6个tokens。
另外,此步骤中,使用者可以依据自身使用条件,选择使用不同差异度计算算法,包括且不限于编辑距离算法、向量空间模型和基于哈希方法的相似计算等;使用者也可以对其进行任何方式的改进修正。
步骤5:依据两份代码其各块的差异度关系,以及相似代码块间差异度最小原则制定相应规则,选择差异度矩阵中的某些元素作为部分差异度,或用某些代码块全部token个数作为部分差异度,对部分差异度进行求和,得到两份代码整体差异度;
本步骤是选择合适的若干差异度值,并进行求和,得到两份代码总体差异度。设二维矩阵中,行所代表的代码文件为代码A,列所代表的代码文件为代码B。本步骤具体执行流程如下:
首先,设常量MAX_REPLACE,其值为代码A在步骤1得到的tokens的长度;设数组flag,其长度为代码B中代码块的个数,各元素初值为0;设整型变量score,初始赋值为0,代表最终相似度得分。
其次,按行遍历矩阵,求取矩阵每行最小值,则score累加当前最小值,并将矩阵该最小值所在的列中的所有元素的值修改为MAX_REPLACE,以及修改flag[i]为MAX_REPLACE。
此处遍历结束后,各行选择结果如图8中圆圈圈出的差异度值。
最后,遍历flag数组,如果该元素值为0,则score累加上该位置对应的列所代表的代码块中包含的token的个数,即card(blocks[i]),其中card为计算块中所包含的token个数函数。
flag数组遍历完成后,则该score值为差异度之和,即两份代码整体差异度。至此两份代码整体差异度计算完毕。由图8,通过差异度矩阵各行最小值累加得到的结果为185,只有第12列未被取值,而代码B中第12块包含的token个数为4,因此本例中总体差异度为score=185+4=189。
本步骤的思想如下:差异度的意义是两份代码不同的token的总个数,也可以理解为从一份代码改动到另一份代码需要改动的token总个数。为获得实际有意义的改动次数,本方法对代码进行分块,依据各块的差异度,选取相近的两个代码块间的差异度,最终求和得到总体差异度。
首先,选择矩阵每行中行列不交叉的最小值,意义是选择代码A中每块,对应代码B中,其最相近的代码块的差异度,而行列不交叉的意义在于,代码A中的代码块与B中的代码块是一一对应的,每个代码块不会被重复的选择两次或以上。
其次,对于代码B中剩余的代码块的差异度的选取方法,其意义在于,如果B中剩余块所在列中的差异度,没有在前一步中被选取,说明该块和A中任意一块均不相似,其差异度即为其自身全部token总个数。
这样,无论代码A、B中任意一块代码块的差异度都在score值中有所体现,保证了此处测算的总体差异度接近于真实值。
本步骤中,不同编程语言的处理均相同或相似。
步骤6:依据两份代码整体差异度和两份代码总体token个数进行计算,得到差异代码所占总体的比例,从而得到两份代码相似度结果。
根据两份代码整体差异度及其tokens通过下式计算二者相似度score,并将该值与预设的相似度阈值s进行比较,当score≥s时,输出检测结果为相似,否则为不相似:
1 - e d i t D i s ( A , B ) ( ( c a r d ( A ) + c a r d ( B ) ) / 2
其中,card(A)或card(B)分别表示A或B代码的全部token个数,editDis(A,B)为两份代码整体差异度。
进一步的,由于差异度算法选择的不同,会带来整体差异度的过大(两份代码几乎不相似)或过小(两份代码太相似),从而带来相似度计算结果会超出[0,1]范围的情况,因此需要对score进行如下判断及修正:
1.如果score结果大于等于1,则将该结果修改为1.0(由于算法自身原因可能会有该情况出现,并不影响实际结果);
2.如果score结果小于等于0.0,则将结果修改为0.0(同1.情况)。最终用户可以依据实际使用情况,选择使用相似度精度。
最终score即为相似度结果,其为一个在[0,1]区间的实数表示,0表示非常不相似,1表示非常相似。使用者可以依据自身设置相似度阈值s,给出相似检测结果。本例中总体差异度为189,代码1tokens总数为570,代码2tokens总数为595,因此score结果为0.676,设置的判断相似度阈值为0.2,则该两份代码检测结果为相似。
本步骤的思想是:两份代码整体差异度即两份代码中不同的token总个数,以其除以两份代码的平均token总个数,可以得到两份代码差异部分所占百分比,由1减去该百分比,可以得到相似部分所占半分比。其值越接近1表明相似部分所占比例越大,即两份代码越相似。
结论
在计算程序间相似度时,首先需要提取程序段的特征值,即能够代表该程序内容和结构的基本语言单位。然后对提取出的待比较程序的特征值进行比较,根据比较结果判断程序间的相似程度,即计算相似度。在这个过程中,特征值的提取至关重要,特征值的好坏直接影响比较结果的准确性。
本方法提取的特征值即为分词结果,在背景中提出的token-base方法基础上,增加了相同变量去重复、程序分块处理和改进差异度计算方法等操作,避免了背景中提及的token-base方法普遍遇到的困难,提高了检测效果。本方法在学习了PDG方法中的分块思想,舍弃了其依赖关系等方面内容,提高了程序的检测效果,而由于本方法本是基于token-comparison方法,仅在一定程度上提高了算法的复杂度,是可接受的。
本方法对于提到的几种特殊情况错误率高进行了修正优化,解决了注入代码检测率低,真正相似代码被拒绝等问题。
本方法前后主要分为分词、分块、计算差异度、计算相似度结果四大部份内容。分词是编译器在进行代码编译时的基本工作之一,此块内容可依据不同语言的编译器来实现,不同语言处理得到的分词结果均可实现统一模式,且分词操作可以直接由公开的几种方法实现,如Python的tokenize模块,Lex等。分块是依据不同编程语言,代码块起始结束标志来定,不同语言起始关键字类似,如if、for、while等,不同语言代码块作用范围结束标志由该语言自身决定,如C++语言的{、}和Python语言的对齐等。差异度的计算也可替换为其他不同计算方法。最终相似度的计算上主要是基于前面差异度的计算结果,不同编程语言均相同或相似。故,本方法也解决了其他代码相似度检测结果难于应用的问题。
以上所述的具体描述,对发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种计算机软件源代码相似度检测方法,其特征在于,包括以下步骤:
步骤1、将两份代码文件,依据其编程语言编译原理进行分词操作,得到分词结果集合tokens;
步骤2、对两份代码tokens分别对以特定token起始的语法代码块结构进行分块操作,得到其各自的分块结果blocks;
步骤3、对blocks中的变量类型token进行标记,统计其在全部代码中出现的次数和来自的block;
步骤4、采用差异度计算方法计算代码文件A中的块与代码文件B中的块的差异度,最终得到一个差异度矩阵;
步骤5、依据两份代码其各块的差异度关系,以及相似代码块间差异度最小原则制定相应规则,选择差异度矩阵中的某些元素作为部分差异度,或用某些代码块全部token个数作为部分差异度,对部分差异度进行求和,得到两份代码整体差异度;
步骤6、依据两份代码整体差异度和两份代码总体token个数进行计算,得到差异代码所占总体的比例,从而得到两份代码相似度结果。
2.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤1所述分词操作通过以下过程完成:
首先,对代码文件,依据其所属编程语言词法规则进行初步分词,得到由若干分词结果(token)组成的集合tokens;
其次,对初步分词结果进行再处理,删除注释或物理空行,并将预先设定的代码块起始关键字token类型改为新的BLOCKNAME类型,其他关键字保持原关键字类型不变。
3.根据权利要求2所述的一种计算机软件源代码相似度检测方法,其特征在于:所述预先设定的代码块起始关键字为循环代码块、判断代码块、函数代码块、类代码块、异常代码块、with代码块以及全局代码块的起始关键字。
4.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤2所述进行token分块操作时,对于某些起始关键字开始的块,根据语言语法规则设定块相关性,对具有相关性的连续块合并成一个代码块。
5.根据权利要求1或4所述的一种计算机软件源代码相似度检测方法,其特征在于:所述进行token分块操作时对于仅包含一条语句的代码块不作为一个单独的块。
6.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤2所述对blocks中变量类型token进行标记,标记方法为将该token写为三元组形式[value,-1*次数,blockname],其中value表示该token的字符串原文,次数表示该token出现的次数,blockname表示该token来自于哪个块,如果是全局块以'global'表示,如果是其它块以其对应块的起始关键字表示。
7.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤4所述差异度计算方法为如下一种改进的编辑距离算法:
(1)查找代码块A、B的最长连续公共token子序列;
(2)如果该序列长度小于预设的最小语句长度MIN,则转到步骤(3);否则,用一个不同于已有token的新的token替换代码块A、B的最长连续公共token子序列,然后返回步骤(1);
(3)以传统的编辑距离算法计算代码块A、B的差异度。
8.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:判断所述变量类型token相同的标准如下:
(1)如果两个token的名称相同,则视为相同;
(2)如果名称不同,但在两份代码中出现次数相同或相近且较大,则视为相同;
(3)如果名称不同,但在两份代码中出现次数相同或相近且较小,且所属块相同,则视为相同。
9.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤5所述依据差异度矩阵以及相似代码块间差异度最小原则制定的相应规则如下:
(1)对差异度矩阵,对于每一行选择不与已选取过值的列相重复的最小值作为该行的差异度;
(2)对于剩余没有被取过值的行或列,选取对应代码文件中代码块的token个数作为该行或列的差异度。
10.根据权利要求1所述的一种计算机软件源代码相似度检测方法,其特征在于:步骤6所述依据两份代码整体差异度和两份代码总体token个数进行计算,过程如下:
(1)依据公式计算初步相似度结果评分Score:
S c o r e = 1 - e d i t D i s ( A , B ) ( ( c a r d ( A ) + c a r d ( B ) ) / 2
其中card(·)表示·中的全部token个数,editDis(A,B)表示代码块A、B的整体差异度;
(2)在输出所述Score前,通过以下过程进行修正:如果score大于1,则将score修改为1;如果score小于0,则将score修改为0。
CN201510794525.1A 2015-11-18 2015-11-18 一种计算机软件源代码相似度检测方法 Active CN105426711B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510794525.1A CN105426711B (zh) 2015-11-18 2015-11-18 一种计算机软件源代码相似度检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510794525.1A CN105426711B (zh) 2015-11-18 2015-11-18 一种计算机软件源代码相似度检测方法

Publications (2)

Publication Number Publication Date
CN105426711A true CN105426711A (zh) 2016-03-23
CN105426711B CN105426711B (zh) 2018-05-15

Family

ID=55504919

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510794525.1A Active CN105426711B (zh) 2015-11-18 2015-11-18 一种计算机软件源代码相似度检测方法

Country Status (1)

Country Link
CN (1) CN105426711B (zh)

Cited By (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106202007A (zh) * 2016-06-28 2016-12-07 电子科技大学 一种matlab程序文件相似度的评估方法
CN106528111A (zh) * 2016-10-25 2017-03-22 广东工业大学 一种数据结构作业程序相似性度量方法
CN107168759A (zh) * 2017-05-04 2017-09-15 工业和信息化部电信研究院 一种软件代码存储方法
CN107506204A (zh) * 2017-09-30 2017-12-22 福建星瑞格软件有限公司 一种基于余弦定理的代码相似度比较的函数重构方法
CN108073521A (zh) * 2016-11-11 2018-05-25 深圳市创梦天地科技有限公司 一种数据去重的方法和系统
CN108304369A (zh) * 2017-05-03 2018-07-20 腾讯科技(深圳)有限公司 一种文件类型的识别方法和装置
CN108399193A (zh) * 2018-01-29 2018-08-14 华侨大学 一种基于序列结构的程序代码聚类方法
CN109074254A (zh) * 2016-03-30 2018-12-21 日立社会信息服务有限公司 程序源转换方法、程序源转换装置、信息处理装置、信息处理方法和程序
CN109218284A (zh) * 2018-07-24 2019-01-15 百度在线网络技术(北京)有限公司 Xss漏洞检测方法及装置、计算机设备及可读介质
CN109976991A (zh) * 2017-12-27 2019-07-05 北京奇虎科技有限公司 一种程序代码的处理方法和装置
CN110659064A (zh) * 2019-09-11 2020-01-07 无锡江南计算技术研究所 一种基于特征元信息的搜索剪枝优化方法
CN110908648A (zh) * 2018-09-17 2020-03-24 北京龙码科技有限公司 一种人工智能辅助图形化编程教学方法及系统
CN110989991A (zh) * 2019-10-25 2020-04-10 深圳开源互联网安全技术有限公司 检测应用程序中源代码克隆开源软件的方法及系统
CN111240681A (zh) * 2019-12-30 2020-06-05 瑞庭网络技术(上海)有限公司 一种不同编程语言的转换方法及装置
CN112131570A (zh) * 2020-09-03 2020-12-25 苏州浪潮智能科技有限公司 一种基于pca的密码硬编码检测方法、装置及介质
CN112131859A (zh) * 2020-08-25 2020-12-25 中央民族大学 藏文作文抄袭检测原型系统
CN112685080A (zh) * 2021-01-08 2021-04-20 深圳开源互联网安全技术有限公司 开源组件查重方法、系统、装置及可读存储介质
US11099842B2 (en) 2019-01-08 2021-08-24 Saudi Arabian Oil Company Source code similarity detection using digital fingerprints
CN113490920A (zh) * 2019-03-26 2021-10-08 西门子股份公司 一种评估代码设计质量的方法、装置和系统
CN113901467A (zh) * 2021-09-27 2022-01-07 四川大学 一种针对Python开源库中恶意组件包的挖掘方法
CN114077434A (zh) * 2021-11-23 2022-02-22 中国银行股份有限公司 代码集映射方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080270991A1 (en) * 2003-11-25 2008-10-30 Zeidman Robert M Software tool for detecting plagiarism in computer source code
CN101425008A (zh) * 2007-11-01 2009-05-06 北京航空航天大学 基于编辑距离的源代码相似度度量方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20080270991A1 (en) * 2003-11-25 2008-10-30 Zeidman Robert M Software tool for detecting plagiarism in computer source code
CN101425008A (zh) * 2007-11-01 2009-05-06 北京航空航天大学 基于编辑距离的源代码相似度度量方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
ALLAHBAKSH ASADULLAH等: "Design Patterns based Pre-processing of Source Code for Plagiarism Detection", 《2012 19TH ASIA-PACIFIC SOFTWARE ENGINEERING CONFERENCE》 *
程金宏: "程序代码相似度度量研究", 《中国优秀硕士学位论文全文数据库·信息科技辑》 *

Cited By (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109074254B (zh) * 2016-03-30 2021-12-24 日立社会信息服务有限公司 程序源转换方法、程序源转换装置
CN109074254A (zh) * 2016-03-30 2018-12-21 日立社会信息服务有限公司 程序源转换方法、程序源转换装置、信息处理装置、信息处理方法和程序
CN106202007B (zh) * 2016-06-28 2018-09-07 电子科技大学 一种matlab程序文件相似度的评估方法
CN106202007A (zh) * 2016-06-28 2016-12-07 电子科技大学 一种matlab程序文件相似度的评估方法
CN106528111B (zh) * 2016-10-25 2019-07-19 广东工业大学 一种数据结构作业程序相似性度量方法
CN106528111A (zh) * 2016-10-25 2017-03-22 广东工业大学 一种数据结构作业程序相似性度量方法
CN108073521A (zh) * 2016-11-11 2018-05-25 深圳市创梦天地科技有限公司 一种数据去重的方法和系统
CN108073521B (zh) * 2016-11-11 2021-10-08 深圳市创梦天地科技有限公司 一种数据去重的方法和系统
CN108304369A (zh) * 2017-05-03 2018-07-20 腾讯科技(深圳)有限公司 一种文件类型的识别方法和装置
CN108304369B (zh) * 2017-05-03 2020-12-01 腾讯科技(深圳)有限公司 一种文件类型的识别方法和装置
CN107168759A (zh) * 2017-05-04 2017-09-15 工业和信息化部电信研究院 一种软件代码存储方法
CN107506204B (zh) * 2017-09-30 2020-08-25 福建星瑞格软件有限公司 一种基于余弦定理的代码相似度比较的函数重构方法
CN107506204A (zh) * 2017-09-30 2017-12-22 福建星瑞格软件有限公司 一种基于余弦定理的代码相似度比较的函数重构方法
CN109976991A (zh) * 2017-12-27 2019-07-05 北京奇虎科技有限公司 一种程序代码的处理方法和装置
CN108399193B (zh) * 2018-01-29 2022-03-04 华侨大学 一种基于序列结构的程序代码聚类方法
CN108399193A (zh) * 2018-01-29 2018-08-14 华侨大学 一种基于序列结构的程序代码聚类方法
CN109218284A (zh) * 2018-07-24 2019-01-15 百度在线网络技术(北京)有限公司 Xss漏洞检测方法及装置、计算机设备及可读介质
CN109218284B (zh) * 2018-07-24 2021-11-23 百度在线网络技术(北京)有限公司 Xss漏洞检测方法及装置、计算机设备及可读介质
CN110908648A (zh) * 2018-09-17 2020-03-24 北京龙码科技有限公司 一种人工智能辅助图形化编程教学方法及系统
US11099842B2 (en) 2019-01-08 2021-08-24 Saudi Arabian Oil Company Source code similarity detection using digital fingerprints
CN113490920A (zh) * 2019-03-26 2021-10-08 西门子股份公司 一种评估代码设计质量的方法、装置和系统
CN110659064B (zh) * 2019-09-11 2022-09-13 无锡江南计算技术研究所 一种基于特征元信息的搜索剪枝优化方法
CN110659064A (zh) * 2019-09-11 2020-01-07 无锡江南计算技术研究所 一种基于特征元信息的搜索剪枝优化方法
CN110989991A (zh) * 2019-10-25 2020-04-10 深圳开源互联网安全技术有限公司 检测应用程序中源代码克隆开源软件的方法及系统
CN110989991B (zh) * 2019-10-25 2023-12-01 深圳开源互联网安全技术有限公司 检测应用程序中源代码克隆开源软件的方法及系统
CN111240681A (zh) * 2019-12-30 2020-06-05 瑞庭网络技术(上海)有限公司 一种不同编程语言的转换方法及装置
CN111240681B (zh) * 2019-12-30 2023-08-15 瑞庭网络技术(上海)有限公司 一种不同编程语言的转换方法及装置
CN112131859A (zh) * 2020-08-25 2020-12-25 中央民族大学 藏文作文抄袭检测原型系统
CN112131570B (zh) * 2020-09-03 2022-06-24 苏州浪潮智能科技有限公司 一种基于pca的密码硬编码检测方法、装置及介质
CN112131570A (zh) * 2020-09-03 2020-12-25 苏州浪潮智能科技有限公司 一种基于pca的密码硬编码检测方法、装置及介质
CN112685080A (zh) * 2021-01-08 2021-04-20 深圳开源互联网安全技术有限公司 开源组件查重方法、系统、装置及可读存储介质
CN112685080B (zh) * 2021-01-08 2023-08-11 深圳开源互联网安全技术有限公司 开源组件查重方法、系统、装置及可读存储介质
CN113901467A (zh) * 2021-09-27 2022-01-07 四川大学 一种针对Python开源库中恶意组件包的挖掘方法
CN114077434A (zh) * 2021-11-23 2022-02-22 中国银行股份有限公司 代码集映射方法及装置

Also Published As

Publication number Publication date
CN105426711B (zh) 2018-05-15

Similar Documents

Publication Publication Date Title
CN105426711A (zh) 一种计算机软件源代码相似度检测方法
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
Navarro et al. Flexible pattern matching in strings: practical on-line search algorithms for texts and biological sequences
Liu et al. NET–a system for extracting web data from flat and nested data records
Hall et al. Introduction to Haskell
JP2726568B2 (ja) 文字認識方法及び装置
JP5144940B2 (ja) 目次抽出におけるロバスト性向上
CN117076653B (zh) 基于思维链及可视化提升上下文学习知识库问答方法
US5243520A (en) Sense discrimination system and method
US20080027934A1 (en) Method for searching for patterns in text
CN111488466B (zh) 中文带标记错误语料生成方法、计算装置和存储介质
JPH1078959A (ja) エッジデータ構造を統一する方法
CN108345468B (zh) 基于树和序列相似度的编程语言代码查重方法
CN114692155B (zh) 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法
CN103440252A (zh) 一种中文句子中并列信息提取方法及装置
Tateosian Python For ArcGIS
JP2007026451A (ja) Xパスクエリーの処理方法
CN116541286A (zh) 一种基于插桩和符号执行的高覆盖率测试数据生成方法
CN101944080A (zh) 一种基于dxf文件格式的读取与xml转换的方法
Okhotin Input-driven languages are linear conjunctive
JPH0869476A (ja) 検索システム
CN116360794A (zh) 数据库语言解析方法、装置、计算机设备及存储介质
Patrick et al. An active learning process for extraction and standardisation of medical measurements by a trainable FSA
KR20050065015A (ko) 프로그램의 복제 여부를 검사하는 방법 및 시스템
US20030101192A1 (en) Method and system for a general computing software system

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
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20190828

Address after: 100098 Beijing Haidian District North Third Ring West Road A 18 Zhongding Building A 5th floor 519

Patentee after: BEIJING MULTI-CODE EDUCATION TECHNOLOGY CO., LTD.

Address before: 100081 Haidian District, Zhongguancun, South Street, No. 5, Beijing Institute of Technology,

Patentee before: BEIJING INSTITUTE OF TECHNOLOGY