论文部分内容阅读
在软件开发过程中,开发人员通常通过复制-粘贴或者添加少量修改来重用代码,这种行为往往会使软件系统中存在大量的代码克隆。代码克隆在给开发人员带来便利的同时也会给软件的理解和维护带来一定困难。通过对软件系统中存在的代码克隆进行检测,可以帮助开发人员快速了解软件系统中克隆代码的分布情况,方便开发人员对这些克隆代码进行维护与重构。为了能够在软件规模较大时有效地检测代码克隆,本文提出了一种基于序列匹配的代码克隆检测方法。该方法通过对原始的Smith-Waterman算法进行改进,引入了一种静态加速扣分策略,从而解决了 Smith-Waterman算法在被检测代码段较长时引起的马赛克问题。同时,该方法通过构建闭合回溯路径对Smith-Waterman算法的回溯过程进行改进,从而提高了该算法在代码克隆识别阶段的效率。接着,本文提出了一种基于字节码的多粒度的Java代码克隆检测方法。通过分析字节码的控制转移指令,该方法能够同时检测出方法粒度与块粒度的代码克隆。特别地,在计算相似性过程中,该方法在指令序列相似度比较的基础上加入了方法调用序列的相似性比较,从而使得代码克隆检测的结果更加准确。由于Java字节码相比于源代码能够更好地反应源代码的语义信息,所以该方法能够更好地检测语义克隆。最后,本文通过两个实验分别对提出的两个方法进行评估,并将本文的方法与现有的一些代码克隆检测方法进行对比,如Nicad、CDSW以及Decard等。实验结果表明,基于序列匹配的代码克隆检测方法的F-measure在测试软件上都有很大提高。同时,基于字节码的Java代码克隆检测方法相对于现有的一些方法,在准确率、召回率与F-measure的平均值上都有一定程度的提高。