CN101425008A - 基于编辑距离的源代码相似度度量方法 - Google Patents

基于编辑距离的源代码相似度度量方法 Download PDF

Info

Publication number
CN101425008A
CN101425008A CNA2007101766889A CN200710176688A CN101425008A CN 101425008 A CN101425008 A CN 101425008A CN A2007101766889 A CNA2007101766889 A CN A2007101766889A CN 200710176688 A CN200710176688 A CN 200710176688A CN 101425008 A CN101425008 A CN 101425008A
Authority
CN
China
Prior art keywords
source code
code block
symbol
similarity
editing distance
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.)
Pending
Application number
CNA2007101766889A
Other languages
English (en)
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.)
Beihang University
Original Assignee
Beihang University
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 Beihang University filed Critical Beihang University
Priority to CNA2007101766889A priority Critical patent/CN101425008A/zh
Publication of CN101425008A publication Critical patent/CN101425008A/zh
Pending legal-status Critical Current

Links

Images

Abstract

本发明提供一种基于编辑距离的源代码相似度度量方法,包括:输入第一源代码块和第二源代码块;识别第一源代码块和第二源代码块中的符号;判断所述符号的类型,根据所述类型设置相应的增加值;逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。利用本发明所提供的方法,可以在进行源代码相似度度量或源代码相似性判断时,提供更高的精确度。

Description

基于编辑距离的源代码相似度度量方法
技术领域
本发明涉及源代码相似度度量方法,更具体而言,涉及基于编辑距离的源代码相似度度量方法。
背景技术
随着软件行业的高速发展,常常会出现源代码复用,也就是对已有的源代码进行拷贝并粘贴到新的上下文环境中,并且为了适应新的上下文环境,而对原有的源代码进行少量的修改。为了判断源代码的复用率,常常需要度量这两块源代码的相似度,也就是判断这两块源代码的相似性。目前,业界通常利用传统的编辑距离方法来计算源代码之间的编辑距离,从而给出相似度的度量值。在此,所述编辑距离是指将字符串s1和字符串s2变成相同字符串而需要进行:(1)把字符串s1中的字符ch1替换成字符串s2中的字符ch2或相反操作;(2)删除字符串s1中的字符ch1或删除字符串s2中的字符ch2以及(3)向字符串s1中插入字符ch2或向字符串s2中插入字符ch1这三种操作的最小次数。
然而,这种传统的编辑距离方法中的三种编辑操作均是针对字符,并且对于任意字符使用三种编辑操作之一时,均是累加一次编辑次数,从未考虑到源代码特有的词法和语法结构,因此在判断源代码的相似性或度量源代码的相似度时,所给出的判断或度量的精确度很低。例如对一段源代码进行几个关键字的修改以及进行几个变量名的修改,尽管前者的修改会对程序的功能造成更大的影响,然而传统的编辑距离方法对这两种修改后的源代码与原有源代码相比后所给出的编辑距离是相同的。由此,当用户利用这种编辑距离进行源代码相似度度量或源代码相似性判断时,会得出一些不正确的结论,尤其是当原有的源代码被通过非正当手段进行复用,也就是被剽窃而需要精确地确定源代码的相似度时,这种传统的编辑距离方法无法满足精确度的需求。因此,需要一种能够针对源代码特有的词法和语法结构,在进行源代码相似度度量或源代码相似性判断时,能提供更高精确度的基于编辑距离的源代码相似度度量方法。
发明内容
本发明的目的是针对利用传统的编辑距离方法进行源代码相似度度量时产生度量精确度不高的问题,而提供一种针对源代码特有的词法和语法结构,在进行源代码相似度度量或源代码相似性判断时,能提供更高的精确度的改进的基于编辑距离的源代码相似度度量方法。
本发明提供一种基于编辑距离的源代码相似度度量方法,包括:输入第一源代码块和第二源代码块;识别第一源代码块和第二源代码块中的符号;判断所述符号的类型,根据所述类型设置相应的增加值;逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。
利用本发明所提供的方法,可以在进行源代码相似度度量或源代码相似性判断时,提供更高的精确度。
附图说明
为了更好地理解本发明,下面结合附图仅以举例的方式对本发明的实施方案作详细说明,其中:
图1示出了根据本发明的一个实施方案计算编辑距离的流程图。
具体实施方式
在下面描述中,为说明起见,描述了很多具体细节以便全面理解本发明的实施方案。然而,对于本领域的技术人员来说,显而易见的是本发明可不采用这些具体细节进行实施。
在本说明书中以及随后的权利要求书中,将涉及到若干术语,这些术语将被定义具有下述含义。
符号(token):一个程序设计语言的基本语法符号。
关键字:也称基本字,如PASCAL语言中的begin、end、if、while和var等。
标识符:用来表示各种名字,如常量名、变量名和过程名等。
字面量:各种类型的常数,如25、3.1415、TRUE和“ABC”等。
访问修饰符:可以限制类和结构,以便只有声明它们的程序或命名空间才能使用它们的符号,如private、static、public、this和const等。
其它:不属于关键字、标识符、字面量和访问修饰符的其他符号,如运算符、界符等。
基于上文所述,已知判断两个字符串s1和字符串s2的差别,可以通过计算这两个字符串之间的编辑距离来实现。虽然上文已经介绍了编辑距离,但是为了更加清楚地理解编辑距离,此处将通过公式的形式,对编辑距离进行定义。假设d(s1,s2)表示字符串s1和s2的编辑距离,″表示一个空字符串,ch1和ch2分别表示串s1和s2中的字符,|s|表示字符串s的长度,则编辑距离的计算满足以下定义:
d(″,″)=0    (1),
d(s,″)=d(″,s)=|s|    (2),
d(s1+ch1,s2+ch2)=
      min(d(s1,s2)+ifch1=ch2 then 0 else 1,//修改操作
      d(s1+ch1,s2)+1,       //插入操作
      d(s1,s2+ch2)+1)        //删除操作            (3)。
本发明所述的编辑距离对上述编辑距离进行了改进,其中d(cs1,cs2)表示源代码块cs1和cs2的编辑距离,″表示一个空源代码块,tc1和tc2分别表示源代码块cs1和cs2中的符号,|cs|表示源代码块cs的长度(即源代码块cs中符号的个数),score表示符号所对应的增加值,则本发明所述的编辑距离满足以下定义:
d(″,″)=0      (1),
d(cs,″)=d(″,cs)=|cs|     (2),
d(s1+tc1,s2+tc2)=
  min(d(cs1,cs2)+if tc1=tc2 then 0 else score,//修改操作
      d(cs1+tc1,cs2)+score,     //插入操作
      d(cs1,cs2+tc2)+score)      //删除操作         (3)。
在上文中已经简单介绍了传统的编辑距离方法,在此,将通过举例的方式利用伪代码对此作进一步的说明,以便更好地理解本发明。
作为例子,用动态规划法来计算两个源代码块f1和f2的编辑距离,即相似度值。首先,传统的编辑距离方法:
输入:源代码块f1,源代码块f2
输出:f1,f2的相似度值
computeSimilarity(f1,f2){
     len_f1=源代码块f1中的字符个数
     len_f2=源代码块f2中的字符个数
     //d[i][j]表示f1中的字符1至字符i和f2中的字符1至
字符j之间的编辑距离
     d[0][0]=0;
     for(int i=0;i<len_f1;i++)
          d[i+1][0]=d[i][0];
     for(int j=0;j<len_f2;j++)
          d[0][j+1]=d[0][j];
     for(int i=0;i<len_f1;i++){
          for(intj=0;j<len_f2;j++){
             float d1,d2,d3;
             if(f1的第i个字符与f2的第j个字符相等)
                 d1=d[i][j];//无需任何编辑操作
             else
                 d1=d[i][j]+1;//修改
             d2=d[i][j+1]+1;//删除
             d3=d[i+1][j]+1;//插入
             d[i+1][j+1]=d1,d2,d3之中的最小值;
         }
    }
    return d[len_f1][len_f2];//返回相似度值
}
本发明所提出的改进的编辑距离方法是指在计算编辑距离时,三种编辑操作均是针对一个符号,而不是针对一个字符,并且在一次具体的编辑操作中是针对该符号相应的类型。也就是说,一个符号可以是单个字符,也可以是两个或多个字符,并且不同的符号的增加值不同,该增加值根据编辑该类型的符号对源代码块的影响度设置,影响度越高,增加值越大,优选地,增加值是不大于1的正数。例如,上述增加值可以如表1中所示。
 
符号的类型 增加值
关键字 1.0
标识符及字面量 0.2
访问修饰符 0.1
其它 0.5
表1
因此,考虑符号以及符号类型,参照图1,上述传统的编辑距离方法可以被修改成:
输入:源代码块f1,源代码块f2
输出:f1,f2的相似度值
computeSimilarity(f1,f2){
     len_f1=源代码块f1中的符号个数
     len_f2=源代码块f2中的符号个数
     //d[i][j]表示f1中的符号1至符号i和f2中的符号1至符号j之间的编辑距离
     d[0][0]=0;
     for(int i=0;i<len_f1;i++)
         d[i+1][0]=d[i][0]+f1的第i个符号的增加值;
     for(int j=0;j<len_f2;j++)
         d[0][j+1]=d[0][j]+f2的第j个符号的增加值;
     for(int i=0;i<len_f1;i++){
         for(int j=0;j<len_f2;j++){
            float d1,d2,d3;
            if(f1的第i个t oken与f2的第j个符号相等)
                 d1=d[i][j];//无需任何编辑操作
            else
                 d1=d[i][j]+两个符号中较大的那个增加值
                                                 //修改
            d2=d[i][j+1]+f1中第i个符号的增加值;//删除
            d3=d[i+1][j]+f2中第j个符号的增加值;//插入
            d[i+1][j+1]=d1,d2,d3之中的最小值;
        }
     }
     return d[len_f1][len_f2];//返回相似度值
}
例如,在上述修改后的方法的任意状态,对于一个关键字来说无论是做修改、插入还是删除编辑操作,其编辑距离增加值均是1;而对于一个访问修饰符来说,其编辑距离增加值则为0.1。
下面将以两个源代码块为例,分别利用上述传统的编辑距离方法和改进的编辑距离方法计算相似度值。
code1:
        public class Foo{
          protected String name;
          private int count;
          public String getName(){
               return name;
          }
          public int getCount(){
             return count;
          }
       }
code2:
       public class Counter{
         private String counterName;
     protected int count;
     protected String getCounterName(){
        return this.counterName;
     }
     protected int getCount(){
        return this.count;
     }
  }
利用传统的编辑距离方法的计算结果(忽略代码中的多余空格,空行):
D(code1,code2)=65,
其中Len(code1)=145,Len(code2)=183,
那么:
computeSimilarity(code1,code2)
=1-D(code1,code2)/Min(Len(code1),Len(code2))
=1-65/Min(145,183)=1-65/145=0.5517。
利用本发明的改进的编辑距离方法的计算结果((忽略代码中的多余空格,空行):
D(code1,code2)=2.8,
其中Len(code1)=32,Len(code2)=36,
computeSimilarity(code1,code2)
=1-D(code1,code2)/Min(Len(code1),Len(code2))
=1-2.8/Min(32,36)=1-2.8/32=0.9125
事实上,这两个代码块非常相似,但是利用传统的编辑距离方法计算的相似度值却远远小于利用本发明的改进的编辑距离方法计算的相似度值,由此可见,本发明的改进的编辑距离方法计算出来的相似度值更符合实际情况。
本发明提供了一种针对源代码特有的词法和语法结构,在计算源代码的编辑距离时,利用符号和符号类型来补偿编辑距离增加值,从而得出更高的精确度的编辑距离的方法,利用该方法可以更加精确地对程序源代码进行相似度度量。
另外,尽管表1中示出了不同类型的符号的增加值,但这仅是出于示例的目的,并不是为了限定,因此,在其它的实施方式中可以根据具体的应用而对这些增加值进行修改。并且,尽管上文以伪代码的形式示出了一种编辑距离的计算过程,但这仅是出于示例的目的,并不是出于限定,因此,任何能够基于符号和符号类型来补偿编辑距离增加值,从而计算出编辑距离的过程都可以采用。显而易见,在此描述的本发明可以有许多变化,这种变化不能认为偏离本发明的精神和范围。因此,所有对本领域技术人员来说显而易见的改变,都包括在本权利要求书的涵盖范围之内。

Claims (6)

1.一种基于编辑距离的源代码相似度度量方法,包括:
输入第一源代码块和第二源代码块;
识别第一源代码块和第二源代码块中的符号;
判断所述符号的类型,根据所述类型设置相应的增加值;
逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,
其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。
2.根据权利要求1所述的方法,其特征在于,所述符号的类型根据编辑该符号对所述源代码相似度的影响度确定。
3.根据权利要求1所述的方法,其特征在于,所述增加值是不大于1的正数。
4.根据权利要求1所述的方法,其特征在于,所述符号的类型为关键字,其相应的增加值为1。
5.根据权利要求1所述的方法,其特征在于,所述符号的类型为标识符和字面量,其相应的增加值为0.2。
6.根据权利要求1所述的方法,其特征在于,所述符号的类型为访问修饰符,其相应的增加值为0.1。
CNA2007101766889A 2007-11-01 2007-11-01 基于编辑距离的源代码相似度度量方法 Pending CN101425008A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CNA2007101766889A CN101425008A (zh) 2007-11-01 2007-11-01 基于编辑距离的源代码相似度度量方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CNA2007101766889A CN101425008A (zh) 2007-11-01 2007-11-01 基于编辑距离的源代码相似度度量方法

Publications (1)

Publication Number Publication Date
CN101425008A true CN101425008A (zh) 2009-05-06

Family

ID=40615645

Family Applications (1)

Application Number Title Priority Date Filing Date
CNA2007101766889A Pending CN101425008A (zh) 2007-11-01 2007-11-01 基于编辑距离的源代码相似度度量方法

Country Status (1)

Country Link
CN (1) CN101425008A (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103777948A (zh) * 2014-01-14 2014-05-07 浙江大学 一种基于代码相似度保持的嵌入式软件更新方法
CN104021786A (zh) * 2014-05-15 2014-09-03 北京中科汇联信息技术有限公司 一种语音识别的方法和装置
CN104424402A (zh) * 2013-08-28 2015-03-18 卓易畅想(北京)科技有限公司 一种用于检测盗版应用程序的方法及装置
CN105426711A (zh) * 2015-11-18 2016-03-23 北京理工大学 一种计算机软件源代码相似度检测方法
CN106126235A (zh) * 2016-06-24 2016-11-16 中国科学院信息工程研究所 一种复用代码库构建方法、复用代码快速溯源方法及系统
CN109783106A (zh) * 2018-12-28 2019-05-21 西安交通大学 一种基于编辑距离的自适应反馈程序评测方法及装置
CN110225007A (zh) * 2019-05-27 2019-09-10 国家计算机网络与信息安全管理中心 webshell流量数据聚类分析方法以及控制器和介质
CN110908648A (zh) * 2018-09-17 2020-03-24 北京龙码科技有限公司 一种人工智能辅助图形化编程教学方法及系统

Cited By (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104424402A (zh) * 2013-08-28 2015-03-18 卓易畅想(北京)科技有限公司 一种用于检测盗版应用程序的方法及装置
CN104424402B (zh) * 2013-08-28 2019-03-29 卓易畅想(北京)科技有限公司 一种用于检测盗版应用程序的方法及装置
CN103777948A (zh) * 2014-01-14 2014-05-07 浙江大学 一种基于代码相似度保持的嵌入式软件更新方法
CN103777948B (zh) * 2014-01-14 2017-01-04 浙江大学 一种基于代码相似度保持的嵌入式软件更新方法
CN104021786B (zh) * 2014-05-15 2017-05-24 北京中科汇联信息技术有限公司 一种语音识别的方法和装置
CN104021786A (zh) * 2014-05-15 2014-09-03 北京中科汇联信息技术有限公司 一种语音识别的方法和装置
CN105426711A (zh) * 2015-11-18 2016-03-23 北京理工大学 一种计算机软件源代码相似度检测方法
CN105426711B (zh) * 2015-11-18 2018-05-15 北京理工大学 一种计算机软件源代码相似度检测方法
CN106126235A (zh) * 2016-06-24 2016-11-16 中国科学院信息工程研究所 一种复用代码库构建方法、复用代码快速溯源方法及系统
CN106126235B (zh) * 2016-06-24 2019-05-07 中国科学院信息工程研究所 一种复用代码库构建方法、复用代码快速溯源方法及系统
CN110908648A (zh) * 2018-09-17 2020-03-24 北京龙码科技有限公司 一种人工智能辅助图形化编程教学方法及系统
CN109783106A (zh) * 2018-12-28 2019-05-21 西安交通大学 一种基于编辑距离的自适应反馈程序评测方法及装置
CN109783106B (zh) * 2018-12-28 2021-05-28 西安交通大学 一种基于编辑距离的自适应反馈程序评测方法及装置
CN110225007A (zh) * 2019-05-27 2019-09-10 国家计算机网络与信息安全管理中心 webshell流量数据聚类分析方法以及控制器和介质

Similar Documents

Publication Publication Date Title
CN101425008A (zh) 基于编辑距离的源代码相似度度量方法
CN105446723B (zh) 用于标识源代码版本之间的语义区别的方法和装置
US5930806A (en) Method and system for data migration from network database to relational database
CN109472446B (zh) 基于bim模型的工程概预算编制方法
JP2002157282A (ja) 工数見積り方法及びその装置並びに記憶媒体
Yu et al. Detecting java code clones with multi-granularities based on bytecode
CN110147235B (zh) 一种源代码与二进制代码间的语义比对方法和装置
CN104915293B (zh) 基于仿射运算的软件测试方法及系统
CN109582948A (zh) 评价观点抽取的方法及装置
CN104969188A (zh) 用于对具有缺少源位置的代码段的源代码建模的方法
CN104298594A (zh) 一种源代码中值计算错误的自动检测和定位方法
CN111488155B (zh) 着色语言翻译方法
CN110262803A (zh) 一种依赖关系的生成方法及装置
CN102999426B (zh) 基于抽象内存模型的非数值型数据的计算方法
CN113379873B (zh) 一种道路曲线确定方法、装置、电子设备
CN106970903B (zh) 物流系统中地址信息的处理方法及装置
WO2018192142A1 (zh) 一种虚拟现实软件开放式开发系统及方法
Redweik et al. Change detection in CityGML documents
CN105068793A (zh) 生成业务逻辑关系图以及实现业务应用的方法和装置
Regnauld Generalisation and data quality
CN116029012A (zh) 一体化龙骨分布图绘制、信息化标注和统计方法及系统
Huebner A simplified approach to flow network analysis: application to engine lubrication systems
US7533335B1 (en) Representing fields in a markup language document
CN103377050A (zh) 一种贴片机程序坐标转换方法
JP6409639B2 (ja) コンパイラプログラム、システム、方法、及び装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Open date: 20090506