论文部分内容阅读
在软件开发过程中,对代码进行复制、粘贴和修改是一种常见的行为。虽然代码复用可以提高软件开发效率,节省软件开发时间,但是其会导致大量相同或相似的代码产生,这一类的代码被叫作代码克隆。代码克隆不仅会造成软件系统中的冗余,导致软件维护问题,而且会对软件的质量产生影响,导致Bug的引人和繁衍。已有的代码克隆检测研究都是找相同或几乎相同的克隆代码,这样会导致克隆分析不全面和不深入,也会导致克隆Bug筛选不充分。本文围绕以下三方面问题,分别开展研究工作,主要内容和贡献包括:(1)Large-gap代码克隆检测算法研究当代码克隆中的差异较大时,我们称其为Large-gap(大差异)代码克隆。差异较大的代码克隆不仅可以更好地反映相似代码间的差异,体现代码功能的扩展(比如,修改和优化),而且可以使代码克隆分析更加全面和深入,帮助筛选和发现代码克隆相关的Bug。但是,Large-gap代码克隆的检测难度较高,已有的基于文本或词法的方法无法对其进行检测,而基于语法树或程序依赖图的方法也受制于大差异的影响。因此,针对这个问题,本文提出了一种全新的Large-gap代码克隆检测算法,并将其实现为代码克隆检测工具CCAligner,来高效地检测差异较大的代码克隆。与已有方法不同的是,我们考虑使用连续的代码片段,而不是单个的词法元素,来作为比对的基本单元。并且,我们进一步设计了一种带误配的索引技术,允许代码片段基于一定的误配进行匹配,来增强对差异代码克隆的检测能力,同时加快比对的速度和提升比对的精度。此外,配合使用非对称的相似度度量技术,我们的方法可以更好地度量差异较大的代码克隆的相似性。实验结果表明,CCAligner对差异较大的代码克隆的检测能力显著优于现有最流行的检测工具。对一般的代码克隆,CCAligner的表现也与最好的方法在时间、可扩展性、召回率和精确率上相当。(2)代码克隆度量分析软件系统中的代码克隆数量庞大,十分不利于软件维护者的理解和管理。需要对代码克隆进行进一步的度量和分析,来帮助和指导从大量的代码克隆中筛选较感兴趣的那些克隆。基于我们提出的最新的Large-gap代码克隆检测工具CCAligner,可以发现更多的Large-gap代码克隆,可进行更深入和全面的代码克隆分析。因此,本文基于CCAligner,进一步开展了代码克隆的度量分析研究。首先,通过与软件工业界交流并结合他们的实际需求,我们首次提出了代码克隆度量的三个指标:克隆强度、克隆频度和克隆距离,来反映克隆的程度和分布。克隆的程度过高,分布过于集中,都属于代码的坏味道(Bad Smell)。然后,我们设计了相应的算法来分析和度量每个指标,并将它们集成到我们的克隆检测工具CCAligner中,作为我们克隆度量分析的研究工具。接下来,基于该工具,我们开展了代码克隆分析的实证研究,来检验工具的效果和探索真实软件系统中代码克隆分布的情况。我们对不同软件、同一软件不同版本进行了实证研究分析,实验结果表明,不同的软件系统中,质量较高(发展时间长)的软件要在三个指标上明显好于其他软件。同时,同一软件随着版本的演进,三个指标表现出越来越好的趋势,意味着软件质量的不断提升。我们的克隆度量分析工具可以从代码克隆的角度,有效地对克隆分布和软件质量进行分析。(3)代码克隆相关Bug检测研究由于代码克隆会导致Bug的引入和繁衍,因此克隆Bug发现研究可以帮助发现软件系统中由克隆引发的问题。克隆Bug同样存在多种类型,大多数已有工作都是针对特定的Bug类型,人工设计和提取特征来进行检测。这些方法只能检测特定类型的Bug,无法检测未知的Bug类型。因此,针对这个问题,本文提出了一种基于深度学习的方法DeepCbd,来自动学习尽可能多的相关特征,同时应用差异克隆算法来提取差异部分代码作为差异信息输入。由于Bug可以体现在代码的语法和词法层面,我们相应地提取了代码的语法树和词法向量表示作为模型的输人。在模型设计上,我们使用了Tree-LSTM来对语法树进行处理,且基于词法向量表示,使用了注意力机制来增强学习的效果。此外,通过改造CCAligner,我们提取了差异代码部分的词法向量表示,将其与模型得到的特征向量进行拼接,来进一步增强检测的能力。实验结果表明,DeepCbd显著优于其他的基线机器学习和深度学习方法,识别准确率达到93.46%。与已有相关研究工作相比,DeepCbd可以识别出大多数已发现的克隆相关Bug类型,而且成功识别出了三种新的Bug类型。此外,交叉验证实验和泛化能力验证实验论证了DeepCbd具有很好的泛化能力和实用性。总体来讲,本文全部的工作可以分为两个方面:代码克隆检测研究和克隆Bug发现研究。在代码克隆检测研究中,我们又具体开展了Large-gap代码克隆检测算法研究和克隆度量分析。