[发明专利]代码克隆的检测方法有效
申请号: | 201410730368.3 | 申请日: | 2014-12-04 |
公开(公告)号: | CN104407872B | 公开(公告)日: | 2018-01-16 |
发明(设计)人: | 张程鹏;李祺;李承泽;董枫;杨昕雨 | 申请(专利权)人: | 北京邮电大学 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 北京德琦知识产权代理有限公司11018 | 代理人: | 王一斌,王琦 |
地址: | 100876 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 代码 克隆 检测 方法 | ||
技术领域
本发明涉及计算机应用技术,特别是涉及一种代码克隆的检测方法。
背景技术
代码克隆(Code Clone)是指软件源代码中重复出现的相同或相似的代码片断。这些代码片断可能完全相同,也可能经过了一些编辑性(如修改变量名)或逻辑性的修改(如修改为相似但不相同的功能)。被认为互相克隆的代码片段往往具有相似的逻辑运算,实现了类似的功能。代码克隆一般是由于复制粘贴式的代码复用造成的,也可能是由于解决相似问题的模式化思维造成的。代码克隆大量存在于大型软件系统以及若干相似的软件系统中。克隆代码在软件工程中与许多问题密切相关,如软件的质量、复杂性、架构、进化、专利和剽窃等。克隆代码检测有广泛的应用:首先,随着开源项目的发展、代码复用规模的扩大,代码复用的广泛程度可以作为代码质量的评判标准和选择所复用的代码模块的参考依据;其次,通过克隆代码检测可以找出大型系统中的克隆代码,并进行重构,从而消除克隆代码,提高源代码的质量。
目前业内普遍依据源代码的文本相似性与功能相似性将克隆代码分成四类:1)除了空格与注释外都相同的代码段;2)除了标志符、类型、空格和注释外句法上都相同的代码段;3)对语句做了增/删/改的复制代码段;4)功能上相同但句法上不同的代码段。其中,一些研究者将第1类称为完全克隆,将第2、3类称为近似克隆,将第4类称为语义克隆。
国内外学者已提出许多克隆检测方法及技术并开发出相应的克隆检测工具。这些方法可大致地分成基于文本、基于词法(token)、基于语法(syntax)、基于语义等。
1)基于文本的检测方法。该方法是在软件系统的源代码上直接进行比较处理(只过滤源代码的注释和布局上的不同点),而不将源代码转换成某种中间表示形式。Johnson首次提出基于文本的克隆检测技术:首先将固定行数的代码段哈希,然后利用增量哈希函数来识别出具有相同哈希值的代码段即克隆代码,同时结合使用滑动窗口技术来查找不同长度的克隆代码。
2)基于词法的检测方法。该方法(也称为基于token的方法)首先使用词法分析工具(如lex)将所有源代码的每一行转换成一个token序列,并将所有序列连接成一个token串;接着扫描这个token以查找相似的token子序列,然后报告这些相似子串所对应的源代码为克隆。
3)基于语法的检测方法。该方法是根据相似的代码段应该也有相似的句法结构而设计的。程序被解析成一棵语法树,其中相似的子树所对应的源代码段就是克隆代码。Baxter等人首次将抽象语法树(AST)技术应用在克隆代码检测上,首先将源代码解析成带有标注的语法树,接着将子树哈希到N个桶(bucket)中,然后对同一个桶中的子树比较相似性,进而获得克隆代码。
4)基于语义的检测方法。该技术主要以程序依赖图(PDG)方法为代表,即给定一个程序,根据程序语句之间的数据流和控制依赖关系建立一个PDG的集合,在此集合中的同构子图所对应的代码段为克隆代码。近年来,也有学者使用动态分析的方法去检测语义上相似的代码段,如加州大学的Jiang等人通过对代码段给定一组输入数据,比较它们的输出结果,进而得到语义上相似的克隆代码。Marcus等人使用信息检索技术(潜在的语义索引)去静态地分析软件系统的源代码进而检测出语义克隆。
基于文本的方法不需考虑程序句法的正确性,时空复杂度最低,可克隆的查全率偏低。该方法主要用来检测第l类克隆。但Lee等人利用n-neighbor方法也能检测到部分近似克隆,效果不理想。
基于token的方法能有效地检测第1、2类克隆,时空复杂度较低,也不需考虑程序句法的正确性,且独立于源代码,但在处理第3类的克隆时会有许多误检。
基于语法的方法能有效地检测第1-3类克隆,但由于需将源代码解析成AST后再查找相似子树,所以时空复杂度偏高。不过后来Jiang等人采用欧式距离和特征向量来优化基于AST的检测方法,降低了寻找同构子树的复杂度。
与基于语法的比较方法相比,基于PDG的技术从一个更高层面去分析源代码,以获得程序的语义信息,所以该技术能检测到一些被打乱顺序、但语义相同的代码段。但建立PDG和寻找同构子图花费的代价亦非常高,难以应用于大规模软件。
由此可见,现有的代码克隆的检测方法存在克隆类型检测不全面、准确度低、复杂度高不易于实现等问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种代码克隆的检测方法,该方法可以有效判断出两个程序代码之间是否存在代码克隆关系,且易于实现。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京邮电大学,未经北京邮电大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201410730368.3/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种多功能开口咬合器
- 下一篇:网格分解方法及系统