论文部分内容阅读
在软件开发和维护过程中,开发者们经常采用复制代码片段不经过任何修改直接粘贴复用、或者粘贴后经过些许修改后复用的开发方法以提高开发效率,这使得软件系统中存在大量相似的代码片段,这些代码片段被称为克隆。虽然代码克隆可以提高开发效率,但是代码克隆也给软件维护带来了巨大的挑战。当其中一个代码片段发生修改,即与克隆中其他的代码片段的一致性被破坏,很有可能会在软件系统中引入与克隆相关的错误。这些错误不容易被发现而且可能会在软件演化过程中潜伏很长时间,可能会对代码质量造成严重威胁。代码克隆检测能帮助开发者发现软件系统中的相似代码片段,而代码一致性维护能帮助维护者管理这些相似代码片段,从而防止克隆相关的错误的引入。根据克隆代码是否用同一种程序语言编写,可以将代码克隆检测技术分为单语言和跨语言的克隆代码检测。目前,代码克隆检测技术主要针对同一种语言编写的代码的相似性进行检测,跨语言的克隆代码检测研究存在着巨大挑战。不同的程序语言有不同的语法和应用程序编程接口。不同语言的代码片段,即使实现相同的功能,在结构上也有差异,而不同的程序语言之间很少存在共同的中间表示语言来比较代码片段进而区分代码克隆。而现有的跨语言的代码克隆检测技术,仅支持跨.NET语言家族中的语言,这些语言都共享一个中间表示语言。然而,并不是所有程序语言都共享该中间表示语言。为此,本文引入不需要中间表示语言的跨语言克隆检测方法。此外,本文还以移动应用为研究对象,利用该方法进一步探索差异更大的跨平台的代码相似性的检测方法。相似代码的一致性维护则是防止克隆相关错误的另一个关键技术。在同一代码克隆组(对)中,当其中一个克隆实例发生修改时,克隆组(对)中的其他克隆实例可能需要相同或者相似的修改来维持克隆代码之间的一致性。然而,相似代码的一致性维护技术的研究滞后于相似代码的检测,现有的单语言克隆代码的一致性维护技术只能维护差异较小的克隆代码之间的一致性,这并不能满足相似代码一致性维护的需求,为此,本文提出规则制导的对差异较大但仍然存在相似性的代码片段的一致性进行维护的方法。此外,本文还提出一种基于双向变换的相似代码一致性维护方法,同步重构前后结构上差异较大的代码。本文主要的贡献如下:·本文提出第一个无需中间表示语言的检测跨语言克隆的方法CLCMiner。该方法从软件演化的历史版本中挖掘克隆代码,通过比较软件历史版本中的代码变化将跨语言克隆检测问题转化为差异匹配问题。·本文研究不同程序语言编写的不同移动平台的同一应用的标识符的相似性,并透过标识符相似性洞察检测跨平台克隆的可行方法。·本文提出一种规则制导的代码克隆同步的方法CCSync。该方法可以抹平克隆代码相互间的结构上的差异,从克隆关系中提取出同步规则,当克隆中的一个代码片段被更新,通过同步规则自动将更新传导给其他代码片段中。·本文提出一种利用双向变换对重构前后代码进行同步与维护的方法,并应用该方法实现对重构后代码选择性的撤销这一功能,帮助程序员可以保留重构以后代码的修改而撤销重构操作。本文通过在一个具体的重构上实现了选择性的撤销验证了该方法的可行性。本文基于上述方法,开发了对应的工具原型,并设计实验评估其精度和准度,实验结果显示上述方法具有较高的精度与准度,从而验证了上述方法的有效性。