首页 / 专利库 / 计算机网络 / 软件缺陷 / 面向bug报告的细粒度缺陷定位方法

面向bug报告的细粒度缺陷定位方法

阅读:647发布:2020-05-17

专利汇可以提供面向bug报告的细粒度缺陷定位方法专利检索,专利查询,专利分析的服务。并且本 发明 提出了 软件 维护领域内的一种面向bug报告的细粒度 缺陷 定位 方法,包括以下步骤:首先基于历史bug报告得到缺陷描述 特征向量 ,构建高频词语料库; 抽取 缺陷所在代码 块 ,构造代码语义矩阵;将特征向量和代码语义矩阵输入神经网络,得到 预测模型 ;根据功能相似的程序训练得到神经网络模型;对新bug报告进行一次语义相近词的替换,将替换后的特征向量输入到预测代码构造模型后输出代码语义矩阵;将新bug报告所对应的源代码划分成代码基本块,并分别编码成代码语义矩阵,构成代码语义矩阵列表;最后比较代码语义矩阵之间的相似性得到相似度最高的代码块,本发明将缺陷定位范围精确到代码基本块级别,能够使得 软件缺陷 修复工作更加高效。,下面是面向bug报告的细粒度缺陷定位方法专利的具体信息内容。

1.一种面向bug报告的细粒度缺陷定位方法,其特征在于,包括以下步骤:
步骤1、将历史bug报告中问题描述部分的自然语言处理成缺陷描述特征向量,作为总的描述词语料库,同时选取出现频率排在前k的单词向量,构建高频词语料库;
步骤2、利用抽象语法树技术提取程序结构,得到历史源代码文件中缺陷所在的代码语法树,基于语法树从控制流和数据流的度,构造变量及基本块的特征向量,然后将代码块编码为代码语义矩阵;
步骤3、根据步骤1中的缺陷描述特征向量和步骤2中的代码语义矩阵构造深度神经网络,训练得到预测代码构造模型;
步骤4、根据功能相似的程序构造神经网络,训练得到比较代码相似度模型;
步骤5、基于步骤1的高频词语料库对新bug报告的缺陷描述特征向量进行一次语义相近词的替换,将替换后的特征向量输入步骤3中的预测代码构造模型后输出代码语义矩阵;
步骤6、基于抽象语法树技术,将新bug报告的全部源代码文件划分成代码基本块,并分别编码成代码语义矩阵,构成代码语义矩阵列表;
步骤7、利用步骤4得到的模型,根据步骤6中的代码语义矩阵列表与步骤5中代码语义矩阵的相似度,对步骤6中的代码语义矩阵列表进行排名,输出相似度排在前n的代码语义矩阵所对应的代码基本块。
2.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤1和步骤2中所述的历史bug报告和历史源代码文件是从已修复缺陷库中抽取得到的,并且历史bug报告和历史源代码文件之间存在对应关系。
3.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤1中所述的构建高频词语料库的具体步骤如下:
步骤1-1:对历史bug报告进行分词,去停用词和词干提取等自然语言处理操作,得到单词列表;分词包括去除标点符号,和将一个完整的句子转换成单词列表;去除停用词是删去经常使用的且对于整个句子的语义信息没有太大贡献的词语;词干提取是将列表的每个单词的衍生词还原成相应的原形;
步骤1-2:基于单词的上下文信息,将单词转换为向量表示,并将所有的向量构建成总的描述词语料库;
步骤1-3:选取出现频率排在前k的单词向量构成高频词语料库。
4.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤2中所述的划分出缺陷所在的代码块,其划分粒度为代码基本块;
代码基本块被定义为程序顺序执行的语句序列,其中只有一个入口和一个出口,且如果这个基本块的第一个语句被执行了,那么基本块内所有语句都会按照顺序仅执行一次。
5.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤2中所述的利用抽象语法树提取程序结构的具体步骤包括:
步骤2-1:将修改前后的源代码表征为抽象语法树的形式;
步骤2-2:对比修改前后代码得到的抽象语法树,在修改前的源代码中定位到缺陷所在基本块;
步骤2-3:得到缺陷所在的代码基本块。将所有的含有缺陷的基本块构建成含有缺陷的基本块集。
6.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤2中所述的将代码块编码为一个代码语义矩阵的具体步骤为:
步骤2-4:基于抽取得到的代码块,提取其控制流和数据流信息,包括变量的类型、基本块的类型和操作类型等;
步骤2-5:根据这些信息构造特征向量,该特征向量可以表示代码块中的变量和基本块的特征;
步骤2-6:以该特征向量作为矩阵的元素,以变量或基本块作为行和列,构建语义矩阵。
7.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤3中所述的根据缺陷描述特征向量和代码语义矩阵构造深度神经网络,训练得到预测代码构造模型的具体步骤包括:
步骤3-1:以同一份历史bug报告中得到的bug描述特征向量Mi(i=1,2……)和历史源代(1)
码的语义矩阵T为输入,构造第一层隐含层,对输入的两种数据建立初步的联系函数ai(T,Mi)(i=1,2……);
步骤3-2:对步骤3-1的隐含层进行k次迭代训练,完善特征向量和对应语义矩阵的联系函数,即ai(n+1)(a1(n),a2(n),a3(n)……)(i=1,2,……,n=1,2……,k);
(k
步骤3-3:保留本次历史bug报告训练最终得到的联系函数A(T,Mi)(i=1,2……)=a+2)(a1(k+1),a2(k+1),a3(k+1)……),选取另一份历史bug报告进行训练;在选取的历史bug报告库中重复步骤3-1和步骤3-2;
步骤3-4:取上述步骤中训练得到的结果,表达出缺陷描述特征向量和其对应代码语义矩阵的关系函数,构造由缺陷描述特征向量计算其代码语义矩阵的模型,称之为预测代码构造模型,并作为神经网络的输出。
8.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤4中所述的根据功能相似的程序构造神经网络,训练得到比较代码相似度模型的具体步骤包括:
步骤4-1:以实现某一功能的多个程序Mi(i=1,2……)为神经网络的输入,并构建相似度比较函数ai(1)(Mi)(i=1,2……);
步骤4-2:通过k次迭代训练,完善计算同一功能程序相似度的函数,即ai(n+1)(a1(n),a2(n),a3(n)……)(i=1,2,……,n=1,2……,k);
步骤4-3:重复步骤4-1和步骤4-2,保留最终函数A(Mp,Mq)=∑ai(k+1)/n(i=1,2……,n),并对这些函数进行迭代训练,得到能普遍计算代码相似度的函数并输出。
9.根据权利要求1所述的面向bug报告的细粒度缺陷定位方法,其特征在于,步骤5中所述的基于高频词语料库对新bug报告的缺陷描述特征向量进行一次语义相近词的替换,包括:
步骤5-1:进行分词、去停用词和操作和词干提取操作,将新bug报告处理成单词列表;
步骤5-2:基于总的描述词语料库,将新bug报告中的词替换成总的描述词语料库中的单词向量;对于在总的描述词语料库中没有出现过的词,为了不丢失其语义信息,对其进行一次语义相近词的替换;
步骤5-3:基于余弦相似性,对于步骤5-2中没有在总的描述词语料库中出现的词语,在高频词语料库中搜索并返回与其相似度最高的单词向量,如果与相似度最高的单词向量之间的相似度值低于M,则认为高频词语料库中没有与这个词语义相近的词语,则不予替换;
否则,进行替换。

说明书全文

面向bug报告的细粒度缺陷定位方法

技术领域

[0001] 本发明涉及一种软件维护方法,特别涉及一种面向bug报告的缺陷定位方法,属于软件维护领域。

背景技术

[0002] 随着软件技术的蓬勃发展,软件规模的扩大以及软件产品愈发复杂,含有缺陷的软件规模以及种类也随之成倍增长。传统的人工分析缺陷原因、人工进行定位和人工修复缺陷已经无法满足现代社会对软件维护的要求。如何应对不断增长的bug报告数量和代码文件规模、提高软件缺陷定位和修复的效率,成为了研究人员关注的热点之一。
[0003] 目前基于bug报告进行软件缺陷定位已有不少先进技术。第一类基于信息检索技术,优化向量空间模型,并结合历史bug报告进行缺陷定位。第二类通过使用代码分段技术和Stack Trace信息分析来提高缺陷定位性能。第三类通过改进tf-idf的计算方式,并利用源代码结构化信息来检索和计算与bug报告中摘要和描述部分内容的相似度,进行缺陷定位。目前的这些研究都将bug报告和源代码文件看作是普通文本,但是,bug报告中使用的是自然语言,而源代码文件中则是代码语言,仅关注两者的文本相似性,而忽视语义信息,会对缺陷定位效果产生一定影响,无法实现细粒度的缺陷定位。缺陷定位技术是缺陷修复技术的关键一步,尽可能精确的定位到较小代码区域中,可以有效地提高缺陷修复效率,节约软件维护成本。

发明内容

[0004] 本发明的目的是提供一种面向bug报告的细粒度缺陷定位方法,细粒度的表示缺陷代码,将定位范围精确到代码基本级别,并且使用深度神经网络自动学习bug报告和缺陷代码之间的关联,实现软件缺陷的自动定位。
[0005] 本发明的目的是这样实现的:一种面向bug报告的细粒度缺陷定位方法,包括以下步骤:
[0006] 步骤1、将历史bug报告中问题描述部分的自然语言处理成缺陷描述特征向量,作为总的描述词语料库,同时选取出现频率排在前k的单词向量,构建高频词语料库;
[0007] 步骤2、利用抽象语法树技术提取程序结构,得到历史源代码文件中缺陷所在的代码块语法树,基于语法树从控制流和数据流的度,构造变量及基本块的特征向量,然后将代码块编码为代码语义矩阵;
[0008] 步骤3、根据步骤1中的缺陷描述特征向量和步骤2中的代码语义矩阵构造深度神经网络,训练得到预测代码构造模型;
[0009] 步骤4、根据功能相似的程序构造神经网络,训练得到比较代码相似度模型;
[0010] 步骤5、基于步骤1的高频词语料库对新bug报告的缺陷描述特征向量进行一次语义相近词的替换,将替换后的特征向量输入步骤3中的预测代码构造模型后输出代码语义矩阵;
[0011] 步骤6、基于抽象语法树技术,将新bug报告的全部源代码文件划分成代码基本块,并分别编码成代码语义矩阵,构成代码语义矩阵列表;
[0012] 步骤7、利用步骤4得到的模型,根据步骤6中的代码语义矩阵列表与步骤5中代码语义矩阵的相似度,对步骤6中的代码语义矩阵列表进行排名,输出相似度排在前n的代码语义矩阵所对应的代码基本块。
[0013] 作为本发明的进一步限定,步骤1和步骤2中所述的历史bug报告和历史源代码文件是从已修复缺陷库中抽取得到的,并且历史bug报告和历史源代码文件之间存在对应关系。
[0014] 作为本发明的进一步限定,步骤1中所述的构建高频词语料库的具体步骤如下:
[0015] 步骤1-1:对历史bug报告进行分词,去停用词和词干提取等自然语言处理操作,得到单词列表;分词包括去除标点符号(例如,.?!;),和将一个完整的句子转换成单词列表;去除停用词是删去经常使用的且对于整个句子的语义信息没有太大贡献的词语(例如the,and,a);词干提取是将列表的每个单词的衍生词还原成相应的原形(例如从opening中提取open);
[0016] 步骤1-2:基于单词的上下文信息,将单词转换为向量表示,并将所有的向量构建成总的描述词语料库;
[0017] 步骤1-3:选取出现频率排在前k的单词向量构成高频词语料库。
[0018] 作为本发明的进一步限定,步骤2中所述的划分出缺陷所在的代码块,其划分粒度为代码基本块;
[0019] 代码基本块被定义为程序顺序执行的语句序列,其中只有一个入口和一个出口,且如果这个基本块的第一个语句被执行了,那么基本块内所有语句都会按照顺序仅执行一次。
[0020] 作为本发明的进一步限定,步骤2中所述的利用抽象语法树提取程序结构的具体步骤包括:
[0021] 步骤2-1:将修改前后的源代码表征为抽象语法树的形式;
[0022] 步骤2-2:对比修改前后代码得到的抽象语法树,在修改前的源代码中定位到缺陷所在基本块;
[0023] 步骤2-3:得到缺陷所在的代码基本块。将所有的含有缺陷的基本块构建成含有缺陷的基本块集。
[0024] 作为本发明的进一步限定,步骤2中所述的将代码块编码为一个代码语义矩阵的具体步骤为:
[0025] 步骤2-4:基于抽取得到的代码块,提取其控制流和数据流信息,包括变量的类型、基本块的类型和操作类型等;
[0026] 步骤2-5:根据这些信息构造特征向量,该特征向量可以表示代码块中的变量和基本块的特征;
[0027] 步骤2-6:以该特征向量作为矩阵的元素,以变量或基本块作为行和列,构建语义矩阵。
[0028] 作为本发明的进一步限定,步骤3中所述的根据缺陷描述特征向量和代码语义矩阵构造深度神经网络,训练得到预测代码构造模型的具体步骤包括:
[0029] 步骤3-1:以同一份历史bug报告中得到的bug描述特征向量Mi(i=1,2……)和历史源代码的语义矩阵T为输入,构造第一层隐含层,对输入的两种数据建立初步的联系函数ai(1)(T,Mi)(i=1,2……);
[0030] 步骤3-2:对步骤3-1的隐含层进行k次迭代训练,完善特征向量和对应语义矩阵的联系函数,即ai(n+1)(a1(n),a2(n),a3(n)……)(i=1,2,……,n=1,2……,k);
[0031] 步骤3-3:保留本次历史bug报告训练最终得到的联系函数A(T,Mi)(i=1,2……)=a(k+2)(a1(k+1),a2(k+1),a3(k+1)……),选取另一份历史bug报告进行训练;在选取的历史bug报告库中重复步骤3-1和步骤3-2;
[0032] 步骤3-4:取上述步骤中训练得到的结果,表达出缺陷描述特征向量和其对应代码语义矩阵的关系函数,构造由缺陷描述特征向量计算其代码语义矩阵的模型,称之为预测代码构造模型,并作为神经网络的输出。
[0033] 作为本发明的进一步限定,步骤4中所述的根据功能相似的程序构造神经网络,训练得到比较代码相似度模型的具体步骤包括:
[0034] 步骤4-1:以实现某一功能的多个程序Mi(i=1,2……)为神经网络的输入,并构建相似度比较函数ai(1)(Mi)(i=1,2……);
[0035] 步骤4-2:通过k次迭代训练,完善计算同一功能程序相似度的函数,即ai(n+1)(a1(n),a2(n),a3(n)……)(i=1,2,……,n=1,2……,k);
[0036] 步骤4-3:重复步骤4-1和步骤4-2,保留最终函数A(Mp,Mq)=∑ai(k+1)/n(i=1,2……,n),并对这些函数进行迭代训练,得到能普遍计算代码相似度的函数并输出。
[0037] 作为本发明的进一步限定,步骤5中所述的基于高频词语料库对新bug报告的缺陷描述特征向量进行一次语义相近词的替换,包括:
[0038] 步骤5-1:进行分词、去停用词和操作和词干提取操作,将新bug报告处理成单词列表;
[0039] 步骤5-2:基于总的描述词语料库,将新bug报告中的词替换成总的描述词语料库中的单词向量;对于在总的描述词语料库中没有出现过的词,为了不丢失其语义信息,对其进行一次语义相近词的替换;
[0040] 步骤5-3:基于余弦相似性,对于步骤5-2中没有在总的描述词语料库中出现的词语,在高频词语料库中搜索并返回与其相似度最高的单词向量,如果与相似度最高的单词向量之间的相似度值低于M,则认为高频词语料库中没有与这个词语义相近的词语,则不予替换;否则,进行替换。
[0041] 与现有技术相比,本发明的有益效果在于:
[0042] 1、本发明针对面向bug报告的缺陷定位问题提出了一种新方法,它提取代码块的控制流和数据流信息,构造变量和基本块的向量,然后将代码基本块表示为一个代码语义矩阵,由此可以表示代码中的语法和语义关联信息,而不仅仅是语法信息或者是语义信息;
[0043] 2、本发明针对代码块进行转换,能够将缺陷定位到基本块级别,使得软件缺陷修复工作的效率大大提高;
[0044] 3、本发明构建了两个深度学习的模型,用于学习bug报告和源代码之间的关联以及学习两个代码之间的相似性;
[0045] 4、本发明提出了高频词语料库的构建,用于对新bug报告进行语义相近词的替换,这样就可以减少问题描述部分语义信息的丢失,提高定位效果。附图说明
[0046] 图1为本发明面向bug报告的细粒度缺陷定位方法的流程图
[0047] 图2为本发明实施例中高频词语料库的部分示意图。
[0048] 图3为本发明实施例中构建代码语义矩阵的示意图。
[0049] 图4为本发明中的预测代码构造模型。
[0050] 图5为本发明中的比较代码相似度模型。
[0051] 图6为本实施例中抽取的AspectJ项目的描述

具体实施方式

[0052] 为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
[0053] 如图1所示的一种面向bug报告的细粒度缺陷定位方法,具体步骤如下:
[0054] 步骤1、本实例在AspectJ、Lucene、OpenJpa、Solr开源项目数据集上进行实验,将状态为fix(已修复)且verified(已证实)的bug报告的问题描述部分筛选出来,进行自然语言处理步骤(分词、去停用词和词干提取)将问题描述部分的自然语言处理成单词列表。
[0055] 然后基于词的上下文信息,将每一个单词处理成一个100d向量,构成一个可以描述bug报告语义信息的m*100的特征向量(m为预处理之后单词个数,特征向量中的每一个元素都是一个100d的向量)。
[0056] 考虑到项目与项目之间的区别,不同项目之间的高频词会有很大差别,所以本发明中将按照项目来分别建立高词频语料库,在后面步骤中使用时,也要在bug报告对应的高频词语料库中对新bug报告进行修改。
[0057] 本实施例中就介绍AspectJ项目高频词语料库的构建过程,其余项目的构建过程类似。
[0058] 本步骤得到的单词向量作为缺陷数据集,按5∶3∶2的形式划分为为训练集、验证集和测试集。
[0059] 按照单词向量出现的频率,选取频率高的前k个单词向量,构建成一个高频词语料库,在AspectJ项目的bug报告中,进行自然语言预处理操作之后的单词长度在两百词左右,因此本实施例中AspectJ语料库中保留256个单词向量;图2为本发明中构建的高频词语料库(前100个)。
[0060] 步骤2、在步骤1筛选bug报告时,利用抽象语法树技术提取程序结构,得到历史源代码中缺陷所在的代码块;这里代码块的划分粒度为代码基本块,本实施例中使用的一个基本块如下:
[0061] if(0!=(modifiers&InputEvent.BUTTON3_MASK)){System.out.println(″Button3″);
[0062] }
[0063] 基于代码块从控制流和数据流的角度,构造变量及基本块的特征向量,然后将代码块编码为一个代码语义矩阵;表1为本实施例中提取出的控制流和数据流信息:
[0064] 表1
[0065]变量/基本块 值 类型
V1 0 int
V2 modiffers int
V3 BUTTON3_MASK int
V4 BUTTON3 int
B1 If(){} if

[0066] 图3为本实施例中根据表1信息构建的语义矩阵;其中V0、I0为零向量。
[0067] 步骤3、根据步骤1中的特征向量和步骤2中的代码语义矩阵构造深度神经网络,训练得到预测代码构造模型;图4为用于预测代码的神经网络构造示意图;
[0068] 步骤4、根据功能相似的程序构造神经网络,训练得到比较代码相似度模型;图5为本发明中的用于比较代码相似度的神经网络构造示意图。
[0069] 步骤5、基于步骤1的高频词语料库对新bug报告的缺陷描述特征向量进行一次语义相近词的替换;图6为本实施例中抽取的AspectJ项目中BugID为39436的bug报告的描述部分。
[0070] 步骤5-1:首先对问题描述部分进行自然语言预处理操作,将新bug报告处理成单词列表,得到:
[0071] {″old″,″task″,″view″,″show″,″summary″,″number″,″task″,″error″,″warn″,″info″,″status″,″line″,″miss″,″rework″,″view″}
[0072] 步骤5-2:基于总的描述词语料库,12个单词在总的描述词语料库中出现过,分别用步骤1中得到的100d向量进行替换;而没有出现的词rework,则基于余弦相似度在高频词语料库中,得到与rework相似度最高的单词向量——behavior,两个词的相似度达到了0.9703289270401001,则将rework的单词向量表示为behavior的100d单词向量。
[0073] 最后将替换后的特征向量(13*100)输入到预测代码构造模型中输出语义矩阵。表3为本实施例中的新bug报告每个单词在整个语料库中出现的次数:
[0074]
[0075] 步骤6、基于抽象语法树技术,将新bug报告的全部源代码文件划分成代码基本块,并分别编码成代码语义矩阵,构成代码语义矩阵列表,如下表所示:
[0076]
[0077] 步骤7、利用步骤4得到的模型,根据步骤6中的代码语义矩阵列表与步骤5中代码语义矩阵相似度大小,对步骤6中的代码语义矩阵列表进行排名,输出相似度排在前n个的代码语义矩阵所对应的代码基本块,即本次定位的结果,如下表所示:
[0078]
[0079] 在本实施例中,本发明通过细粒度的表示缺陷代码,成功定位到了缺陷所在的代码块,即代码块1,极大地提高了定位效率、软件缺陷修复效率。
[0080] 本发明并不局限于上述实施例,在本发明公开的技术方案的基础上,本领域的技术人员根据所公开的技术内容,不需要创造性的劳动就可以对其中的一些技术特征作出一些替换和变形,这些替换和变形均在本发明的保护范围内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈