一种基于图的端到端程序修复方法与流程

文档序号:24184933发布日期:2021-03-09 13:26阅读:103来源:国知局
一种基于图的端到端程序修复方法与流程

1.本发明属于软件调试领域,特别涉及一种基于图的端到端程序修复方法。


背景技术:

2.软件开发过程中,由于各个阶段的综合作用,产生程序缺陷(bug)是不可避免的,而有历史数据表明45%的软件开发成本消耗于定位和修复的过程中。在软件开发人员和维护人员确定缺陷产生的位置之后,往往需要花费大量的精力去人工修复发现的缺陷。因此,为了降低修复过程的成本,工业生产和学术研究领域开始研究自动程序修复的方法。
3.目前自动程序修复仍处于发展阶段,其中主流的程序修复方法是基于测试集的修复方法。基于测试集的修复方法主要分为三类。第一类是启发式的方法,该方法在程序修改产生的搜索空间上进行补丁构造和迭代以生成能够通过测试集验证的补丁。第二类是基于约束的方法,这类方法通过构建补丁代码应该满足的约束条件并通过这些约束条件生成正确的补丁。第三类方法是基于学习的方法,这一类方法结合最新的深度学习模型,用深度学习的方法代替人工特征提取的过程并自动化地生成修复补丁。三类方法中,第一类和第二类方法多采用人工提取缺陷特征或模式的方法,但由专家手动提取特征和模式的方法效率低下且主观性较强,缺乏泛化能力;而第三类方法虽然避免了大量的人工干预,但是由于没有找到更合适的代码表征方法,其采用的模型无法学习到足够的程序缺陷特征信息导致修复能力低下。


技术实现要素:

4.本发明的目的在于提供一种具有代码表征方式新颖、缺陷特征提取能力优异、泛化性能和修复能力强劲等特点的自动程序修复方法。
5.实现本发明目的的技术解决方案为:一种基于图的端到端程序修复方法,所述方法包括以下步骤:
6.步骤1,构建缺陷数据集;
7.步骤2,进行缺陷程序切片,提取与缺陷语句相关的上下文;
8.步骤3,进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构;
9.步骤4,构建并训练graph2seq模型;
10.步骤5,利用训练好的graph2seq模型生成修复补丁并验证补丁的正确性。
11.进一步地,步骤1所述构建缺陷数据集具体过程包括:
12.步骤1-1,从开源软件存储库中获取缺陷数据及修复补丁对;
13.步骤1-2,对成对的代码数据进行预处理:选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对该修复补丁对应的进行同样的处理,获得数据集;
14.步骤1-3,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的
20%作为测试集。
15.进一步地,步骤2所述进行缺陷程序切片,提取与缺陷语句相关的上下文,具体包括:
16.步骤2-1,利用工具checkmarx将代码数据切片,删除与缺陷和修复无关的代码行,保留与缺陷和修复有语义关联的代码行;
17.步骤2-2,在缺陷语句首尾插入特殊单词标记,该标记用来控制生成补丁过程的起止。
18.进一步地,步骤3所述进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,具体过程包括:
19.步骤3-1,对经上述处理后的代码进行表征,具体包括:将程序代码转换为ast树,并根据程序语法和语义,利用不同类型的边连接ast树中的结点,形成不同类型的图;
20.步骤3-2,基于所述ast树和不同类型的图,构建语料库;
21.步骤3-3,利用word2vec,对语料库中的tokens进行词向量学习,获得一组词向量。
22.进一步地,步骤3-1中所述利用不同类型的边连接ast树中的结点,形成不同类型的图,具体包括:
23.(1)根据程序数据流使用lastread、lastwrite、computedfrom三种边连接相关结点构成数据流图dataflowgraph;
24.(2)根据程序表达式结构使用guardedby、guardedbynegation两种边连接相关结点构建参数闭合图guardedbygraph;
25.(3)根据程序语句顺序结构使用nexttoken边连接相关结点构成顺序图nexttokengraph;
26.(4)根据程序中函数与变量的调用关系使用returns to、formalargname两种边连接相关结点构成调用图callgraph。
27.进一步地,步骤3-2所述基于所述ast树和不同类型的图,构建语料库,具体过程包括:
28.步骤3-2-1,提取所述ast树和不同类型的图中的结点,标记为token,构建语料库;
29.步骤3-2-2,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token。
30.进一步地,步骤4所述构建并训练graph2seq模型,具体过程包括:
31.所述graph2seq模型,包括图编码器和序列解码器两部分;
32.(1)构建图编码器,具体包括:
33.步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
34.步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
35.步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
36.sp
i

j
=[e(i,k1),e(k1,k2),...,e(k
n
,j)]
[0037]
或sp
j

i
=[e(j,k1),e(k1,k2),...,e(k
n
,i)]
[0038]
式中,sp
i

j
表示结点i到结点j之间的关系路径,sp
j

i
表示结点j到结点i之间的关系路径,若记sp
i

j
为结点i和结点j之间的正向最短关系路径,则sp
j

i
为结点i和结点j之间的正向最短关系路径,e(
·
,
·
)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,k
i
表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
[0039]
步骤4-4,进行关系编码;
[0040]
利用双向gru模型对关系路径信息进行序列编码:
[0041][0042][0043]
式中,t为当前时间步,为t时刻正向状态向量,为t时刻反向状态向量,f代表正向路径,b代表反向路径,sp
t
指t时刻的最短关系路径;gru为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
[0044]
则结点i、j之间的关系编码表示为:
[0045][0046]
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
[0047]
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在ast树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
[0048]
步骤4-6,结合步骤4-4得到的结点间关系向量r
ij
和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分s
ij

[0049][0050]
将上述公式展开得:
[0051][0052]
式中,x
i
、x
j
分别为结点i和结点j的初始结点向量表示,r
i

j
和r
j

i
分别表示结点间关系向量r
ij
的正向部分和反向部分,w
qt
为查询向量的转置,w
k
为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
[0053]
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
[0054]
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
[0055]
步骤4-7,根据步骤4-6得到的全局注意力得分s
ij
和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
[0056]
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
[0057]
(3)训练graph2seq模型
[0058]
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的graph2seq模型中的参数。
[0059]
进一步地,步骤5所述利用训练好的graph2seq模型生成修复补丁并验证补丁的正确性,具体过程包括:
[0060]
步骤5-1,针对存在缺陷并定位到问题语句的程序,重复步骤2-1进行程序切片,得到与缺陷相关代码语句;重复步骤3-1,将缺陷相关代码语句转化为图;重复步骤3-3,将得到的图进行嵌入,之后输入到训练后的graph2seq模型,输出与问题语句相对应的候选修复token序列,并根据预测概率对候选序列进行降序排序形成token列表;
[0061]
步骤5-2,根据token列表还原token序列得到候选修复语句列表;
[0062]
步骤5-3,验证候选补丁正确性:将每个候选修复语句返回程序并替换缺陷代码语句,之后通过给定的测试用例集计算测试通过率,将通过率高于预设阈值修复语句保留,返回可用修复语句列表。
[0063]
本发明与现有技术相比,其显著优点为:1)采用图表示的方法对缺陷程序进行表示,通过建立多种类型的图来表达代码丰富的语法语义信息,从而更好地提取缺陷特征;2)图表示过程中建立的图与编程语言类型无关,相较于传统的程序表示方法,具备语言无关性,从而使模型具备更强的泛化能力;3)采用程序切片的方法对缺陷语句的上下文进行精简,在保留程序语义信息的同时极大减少了上下文的长度,进一步提高了修复模型的效率;4)提出引入关系编码的方法和注意力机制,相比于传统的编码器,引入注意力机制的编码器参数更少,速度更快,对距离较远的结点之间使用关系编码的方法将距离信息编码使编码器对于结点之间的长距离依赖关系有更强的学习能力。
[0064]
下面结合附图对本发明作进一步详细描述。
附图说明
[0065]
图1为一个实施例中基于图的端到端程序修复方法的流程图。
[0066]
图2为一个实施例中程序切片效果示意图;
[0067]
图3为一个实施例中代码数据流图dataflowgraph示意图
[0068]
图4为一个实施例中graph2seq模型示意图。
具体实施方式
[0069]
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅用以解释本申请,并不用于限定本申请。
[0070]
在一个实施例中,结合图1,本发明提出了一种基于图的端到端程序修复方法,该方法包括以下步骤:
[0071]
步骤1,构建缺陷数据集;
[0072]
步骤2,进行缺陷程序切片,提取与缺陷语句相关的上下文;
[0073]
步骤3,进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构;
[0074]
步骤4,构建并训练graph2seq模型;
[0075]
步骤5,利用训练好的graph2seq模型生成修复补丁并验证补丁的正确性。
[0076]
进一步地,在其中一个实施例中,步骤1所述构建缺陷数据集具体过程包括:
[0077]
步骤1-1,从开源软件存储库github采集代码文件,从项目的提交历史中提取关键词为“fix”、“bug”和“patch”的提交,提取出缺陷代码与修复补丁对;
[0078]
步骤1-2,对成对的代码数据进行预处理:选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对该修复补丁对应的进行同样的处理,获得数据集;
[0079]
步骤1-3,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。
[0080]
进一步地,在其中一个实施例中,步骤2所述进行缺陷程序切片,提取与缺陷语句相关的上下文,具体包括:
[0081]
步骤2-1,利用工具checkmarx将代码数据切片,删除与缺陷和修复无关的代码行,保留与缺陷和修复有语义关联的代码行;
[0082]
步骤2-2,在缺陷语句首尾插入特殊单词标记,该标记用来控制生成补丁过程的起止。
[0083]
采用本实施例的方案,通过程序切片对程序进行加工,能够极大地减少缺陷语句的上下文,提高模型学习的效率与精确度。
[0084]
进一步地,在其中一个实施例中,步骤3所述进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,具体过程包括:
[0085]
步骤3-1,对经上述处理后的代码进行表征,具体包括:将程序代码转换为ast树,并根据程序语法和语义,利用不同类型的边连接ast树中的结点,形成不同类型的图;
[0086]
步骤3-2,基于所述ast树和不同类型的图,构建语料库;
[0087]
步骤3-3,利用word2vec,对语料库中的tokens进行词向量学习,获得一组词向量。
[0088]
采用本实施例的方案,相比于传统的将代码表示成序列的表示方法,能够保留较为完整的语义语法信息,从而进一步提升模型编码器的特征学习效率与解码器的生成准确度。
[0089]
进一步地,在其中一个实施例中,步骤3-1中所述利用不同类型的边连接ast树中的结点,形成不同类型的图,具体包括:
[0090]
(1)根据程序数据流使用lastread、lastwrite、computedfrom三种边连接相关结点构成数据流图dataflowgraph;
[0091]
(2)根据程序表达式结构使用guardedby、guardedbynegation两种边连接相关结点构建参数闭合图guardedbygraph;
[0092]
(3)根据程序语句顺序结构使用nexttoken边连接相关结点构成顺序图nexttokengraph;
[0093]
(4)根据程序中函数与变量的调用关系使用returns to、formalargname两种边连接相关结点构成调用图callgraph。
[0094]
将程序代码表示成上述类型的图可以在保留程序语法和语义的情况下将程序转换为图的形式。
[0095]
进一步地,在其中一个实施例中,步骤3-2所述基于所述ast树和不同类型的图,构建语料库,具体过程包括:
[0096]
步骤3-2-1,提取所述ast树和不同类型的图中的结点,标记为token,构建语料库;
[0097]
步骤3-2-2,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token。
[0098]
进一步地,在其中一个实施例中,步骤4所述构建并训练graph2seq模型,具体过程包括:
[0099]
所述graph2seq模型,包括图编码器和序列解码器两部分;
[0100]
(1)构建图编码器,具体包括:
[0101]
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
[0102]
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
[0103]
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
[0104]
sp
i

j
=[e(i,k1),e(k1,k2),...,e(k
n
,j)]
[0105]
或sp
j

i
=[e(j,k1),e(k1,k2),...,e(k
n
,i)]
[0106]
式中,sp
i

j
表示结点i到结点j之间的关系路径,sp
j

i
表示结点j到结点i之间的关系路径,若记sp
i

j
为结点i和结点j之间的正向最短关系路径,则sp
j

i
为结点i和结点j之间的正向最短关系路径,e(
·
,
·
)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,k
i
表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
[0107]
步骤4-4,进行关系编码;
[0108]
利用双向gru模型对关系路径信息进行序列编码:
[0109][0110][0111]
式中,t为当前时间步,为t时刻正向状态向量,为t时刻反向状态向量,f代表正向路径,b代表反向路径,sp
t
指t时刻的最短关系路径;gru为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
[0112]
则结点i、j之间的关系编码表示为:
[0113][0114]
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
[0115]
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在ast树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
[0116]
步骤4-6,结合步骤4-4得到的结点间关系向量r
ij
和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分s
ij

[0117][0118]
将上述公式展开得:
[0119][0120]
式中,x
i
、x
j
分别为结点i和结点j的初始结点向量表示,r
i

j
和r
j

i
分别表示结点间关系向量r
ij
的正向部分和反向部分,为查询向量的转置,w
k
为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置,通过这种计算方式可以更好地对结点间的关系进行表征;
[0121]
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
[0122]
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
[0123]
步骤4-7,根据步骤4-6得到的全局注意力得分s
ij
和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
[0124]
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
[0125]
(3)训练graph2seq模型
[0126]
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的graph2seq模型中的参数。
[0127]
采用本实施例的方案,其中引入关系编码的方法和注意力机制,编码器参数更少,速度更快,对距离较远的结点之间使用关系编码的方法将距离信息编码使编码器对于结点之间的长距离依赖关系有更强的学习能力。
[0128]
进一步地,在其中一个实施例中,步骤5所述利用训练好的graph2seq模型生成修复补丁并验证补丁的正确性,具体过程包括:
[0129]
步骤5-1,针对存在缺陷并定位到问题语句的程序,重复步骤2-1进行程序切片,得到与缺陷相关代码语句;重复步骤3-1,将缺陷相关代码语句转化为图;重复步骤3-3,将得到的图进行嵌入,之后输入到训练后的graph2seq模型,输出与问题语句相对应的候选修复token序列,并根据预测概率对候选序列进行降序排序形成token列表;
[0130]
步骤5-2,根据token列表还原token序列得到候选修复语句列表;
[0131]
步骤5-3,验证候选补丁正确性:将每个候选修复语句返回程序并替换缺陷代码语句,之后通过给定的测试用例集计算测试通过率,将通过率高于预设阈值修复语句保留,返回可用修复语句列表。
[0132]
作为一种具体示例,在其中一个实施例中,对本发明基于图神经网络的缺陷自动修复方法进行进一步验证说明,包括以下内容:
[0133]
1、构建缺陷数据集,从开源软件存储库github采集代码文件,从项目的提交历史中提取关键词为“fix”、“bug”和“patch”的提交,提取出缺陷代码与修复补丁对并进行预处理,选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语
句,对相应的缺陷代码进行同样的处理,获得数据集,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。数据集中的一个样本如下表1所示。
[0134]
表1训练集中某一样本
[0135][0136][0137]
2、缺陷程序切片,提取与缺陷语句相关的上下文。对所有程序进行程序切片,通过工具checkmarx将代码数据切片,并在缺陷代码语句首尾插入特殊标记。如图2,通过程序切片可以删除与缺陷和修复无关的代码行,仅保留与缺陷和修复有语义关联的代码行。
[0138]
3、缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,根据程序语法和语义,使用不同类型的边连接ast树中的结点,构建不同类型的图。其中,如图3所示,根据程序数据流使用lastread、lastwrite、computedfrom三种边连接相关结点构成数据流图dataflowgraph。其余的图构建方式如下:根据程序表达式结构使用guardedby、guardedbynegation两种边连接相关结点构建参数闭合图guardedbygraph,根据程序语句顺序结构使用nexttoken边连接相关结点构成顺序图nexttokengraph,根据程序中函数与变量的调用关系使用returns to、formalargname两种边连接相关结点构成调用图callgraph。将程序代码表示为图之后,构建语料库,提取上述生成的ast树和不同类型的图中的结点标记为token构建语料库。将出现频率较低而长字符token进行拆解,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token,限制语料库中词汇量。拆分完成后利用word2vec,对语料库中的tokens进行词向量学习,最终获得一组词向量。
[0139]
4、构建和训练graph2seq模型,如图4所示,模型能够学习图中的程序缺陷特征。模
型的构建和训练过程如下:
[0140]
所述graph2seq模型,包括图编码器和序列解码器两部分;
[0141]
(1)构建图编码器,具体包括:
[0142]
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
[0143]
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
[0144]
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
[0145]
sp
i

j
=[e(i,k1),e(k1,k2),...,e(k
n
,j)]
[0146]
或sp
j

i
=[e(j,k1),e(k1,k2),...,e(k
n
,i)]
[0147]
式中,sp
i

j
表示结点i到结点j之间的关系路径,sp
j

i
表示结点j到结点i之间的关系路径,若记sp
i

j
为结点i和结点j之间的正向最短关系路径,则sp
j

i
为结点i和结点j之间的正向最短关系路径,e(
·
,
·
)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,k
i
表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
[0148]
步骤4-4,进行关系编码;
[0149]
利用双向gru模型对关系路径信息进行序列编码:
[0150][0151][0152]
式中,t为当前时间步,为t时刻正向状态向量,为t时刻反向状态向量,f代表正向路径,b代表反向路径,sp
t
指t时刻的最短关系路径;gru为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
[0153]
则结点i、j之间的关系编码表示为:
[0154][0155]
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
[0156]
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在ast树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
[0157]
步骤4-6,结合步骤4-4得到的结点间关系向量r
ij
和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分s
ij

[0158][0159]
将上述公式展开得:
[0160][0161]
式中,x
i
、x
j
分别为结点i和结点j的初始结点向量表示,r
i

j
和r
j

i
分别表示结点间
关系向量r
ij
的正向部分和反向部分,w
qt
为查询向量的转置,w
k
为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
[0162]
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
[0163]
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
[0164]
步骤4-7,根据步骤4-6得到的全局注意力得分s
ij
和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
[0165]
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
[0166]
(3)训练graph2seq模型
[0167]
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的graph2seq模型中的参数。
[0168]
5、利用训练好的graph2seq模型生成修复补丁并验证补丁的正确性。将存在缺陷并定位到问题语句的程序进行切片、表示和嵌入后输入到训练后的graph2seq模型,输出与问题语句相对应的候选修复token序列,根据预测概率对候选序列进行降序排序。然后根据token列表还原token序列得到候选修复语句列表,将候选修复语句返回程序并替换缺陷代码语句,最后通过给定测试用例集计算测试通过率,根据通过率返回可用修复补丁列表,达到修复效果。
[0169]
本发明提出的方法采用程序切片的方法精简缺陷语句上下文,并采用较之序列表示方法语义表达更为精准的图表示的方法表示缺陷程序,同时选取与输入相匹配的graph2seq模型进行训练,很好地达到了自动给出修复补丁的目的,极大提升程序缺陷修复的准确性。
[0170]
以上显示和描述了本发明的基本原理、主要特征及优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1