论文部分内容阅读
近年来,代码克隆检测在软件开发,维护以及bug检测中的意义越来越重要。目前对于存在文本差异的克隆检测,即学术界定义的级别3和级别4,现有方法存在检出率不高的问题。程序依赖图(PDG,Program Dependency Graph)包含源代码的语法和结构信息,因此基于PDG的方法能够发现一些其他方法难以发现的程序结构相似或者相同的代码。但是这类方法主要基于子图同构检测等精确图匹配算法,算法复杂度高且无法发现代码之间存在的局部相似性。因此,如何更快速,全面和准确地进行图相似性计算是基于PDG进行代码克隆检测面临的一大挑战。为此,本文首先对PDG对集合进行了本身结构的简化和过滤,并对非精确图匹配算法进行了深入研究,主要研究内容和贡献如下:(1)PDG预处理及过滤方法设计我们对代码分析工具生成的PDG进行了研究和分析,发现其中包含很多由于PDG生成工具配置而生成的与源代码信息无关的冗余节点,造成了 PDG规模的增加,影响后续的节点匹配工作。基于此,本文提出了一种PDG结构简化的启发式策略,对这些节点和边进行了剔除,并对代码块中第三方库函数调用的冗余子图进行了合并。另外,对所有的候选克隆对直接进行比对也增加了大量的工作负担,本文提出了一系列的启发式过滤策略,从代码的数值特征和语义特征两个方面对候选克隆对集合进行了过滤。实验结果表明,PDG结构约简能使PDG图规模缩减20%以上,过滤策略相较其他方法过滤掉了更多的PDG对,有效地缩减了克隆检测算法的计算规模。(2)基于Weisfeiler-Lehman图核算法的检测方法设计现有的PDG匹配多采用子图同构这类精确图匹配算法,算法时间复杂度高,是NP难问题且回收率低。因此本文设计了一种基于Weisfeiler-Lehman图核算法的非精确图匹配方法,通过对每个节点的邻居节点信息的统计,计算两个图结构间子树同构的对数作为图相似度的度量值,在保留图的结构信息同时能够更快速的检测出PDG之间的局部相似性。最后,我们将本文提出的PDG预处理,过滤方法和图匹配方法结合形成完整的克隆检测方法,与已有检测方法在真实数据集和统一的克隆算法评估框架上进行了比对实验。实验结果表明,本文提出的方法在linux,jdk等真实数据集上比CCSharp和Oreo这些PDG方法运行时间快1-3倍,召回率比其他方法最多能高40%左右,F1值也高10%以上,即能够更快地发现更多的克隆对。