TransRepair: Context-aware Program Repair for Compilation Errors
基本信息
ASE '22: 37th IEEE/ACM International Conference on Automated Software Engineering
博客贡献人
页禾七
作者
Xueyang Li,Shangqing Liu,Ruitao Feng,Guozhu Meng,Xiaofei Xie,Kai Chen
From:School of Cybersecurity, UCAS China,Nanyang Technological University Singapore,University of New South Wales Australia,Singapore Management University
标签
程序修复、编译错误、深度学习、上下文感知
摘要
- 自动修复编译错误能指导新手编写和调试代码,提高软件开发的生产力,目前基于学习的程序修复受到广泛关注;
- 本文提出一种端到端的方法——TransRepair,设计了一个基于Transform的神经网络。与其他方法相比,该方法考虑到错误代码和编译诊断反馈的上下文;
- 本文从两个真实程序数据集和互联网中总结了 5 种类型和 74 种细粒度的编译错误子类型,并开发了一种程序损坏技术(program corruption technique)来综合大型数据集
- 通过大量实验,证明TransRepair 在单次修复准确率和完整修复准确率两方面都优于最先进的技术
1 介绍
背景与动机
-
自动程序修复一般来说可以大致分为程序逻辑错误修复和编译错误修复。其中程序逻辑错误修复受到广泛关注,编译错误修复在过去几年才进入研究人员的视野;
-
先前研究直接利用基于 RNN 的编码器-解码器框架将错误的程序作为输入来生成精确的修复。然而,所选模型架构的学习能力有限,并且存在 RNN 难以应对序列中的远程依赖关系等缺点;
-
部分研究(如DrRepair)证明编译器诊断反馈对于提高准确性很有价值;
-
在数据集方面,存在两个 C 语言编译错误的开源数据集DeepFix和TRACER;
不足:虽然其他研究通过程序损坏方法进一步增强数据集,但是合成的代码在错误类型上受到限制,在处理现实中的错误代码时修复性能大幅降低;此外,用于训练修复模型的数据尚未得到广泛评估,因此尚不清楚哪些类型的错误无法被很好地学习以及根本原因
本文贡献
- 对DeepFix、TRACER以及StackOverflow 中常见的编译错误进行了实证分析,总结出 74 种具体的编译错误模式和 5 个类别。在此基础上,进一步设计了一些细粒度的扰动策略来创建包含各种错误类型的数据集;
- 提出了一种基于 Transformer 的修复模型,它将损坏程序的每一行、其上下文和错误消息作为输入来定位和修复错误代码。开创性地考虑上下文信息来修复编译错误;
- 对两个开源数据集进行的大量实验表明,TransRepair 在单次修复和完整修复方面均优于最先进的技术。此外,消融和故障案例研究根据不同类型的错误确定了固有的优势和局限性。
2 系统概述
问题表述
给定:
数据集 D D D中的错误程序 p p p, p = ( l 1 , l 2 , . . . l n ) p=(l_1,l_2,...l_n) p=(l1,l2,...ln),其中 n n n 为 p p p 中的总行数;
编译器提供的诊断反馈列表 ( i e r r , m e r r ) (i_{err}, m_{err}) (ierr,merr),其中 i e r r i_{err} ierr是报告的错误行号, m e r r m_{err} merr是错误信息(诊断反馈报告的错误行号可能与错误程序中导致错误根本原因的行不匹配);
目标:
从数据集 D D D中学习函数 f f f,该函数以 ( p , i e r r , m e r r ) (p, i_{err}, m_{err}) (p,ierr,merr)作为输入,识别错误代码行 l k , k ∈ ( 1 , . . . , n ) l_k, k\in{(1,...,n)} lk,k∈(1,...,n)的位置 k k k以及该语句修复后的语句 l k ′ l_k' lk′;
该过程可表示为:
l
k
′
=
f
(
p
,
i
e
r
r
,
m
e
r
r
)
l_k' = f(p, i_{err}, m_{err})
lk′=f(p,ierr,merr)
方法概述
三个模块:数据合成,数据解析,模型架构,如图2所示。
- 数据合成:根据经验总结DeepFix、TRACER和来自StackOverflow的自建数据集中的常见编译错误,并根据总结结果设计一套扰动策略(perturbation strategies)来破坏DeepFix中的正确程序,构建符合真实场景的高质量数据集 D D D;
- 数据解析:对于构建数据集中的每个错误程序 p p p,对其编译来获得编译器提供的诊断反馈 ( i e r r , m e r r ) (i_{err},m_{err}) (ierr,merr),此外设计一个上下文分析器来提取每行代码的的上下文,最终获得每一行 l i l_i li,该行的上下文 c i c_i ci以及诊断反馈 ( i e r r , m e r r ) (i_{err},m_{err}) (ierr,merr);
- 模型架构:将数据解析模块获得的结果作为Transformer编码器的输入来学习向量表示,并进一步利用MLP(全连接前馈网络)来定位错误的行,使用基于指针的Transformer解码器来生成错误代码的修复。
3 数据合成
3.1 编译错误的分类
首先删除特定信息(如标识符名称和行号)来标准化错误消息,将相同的标准化消息进行分组分类;
然后识别错误的类型以及错误消息是否准确(找到代码错误的原因),共提炼出74种错误模式,并进一步在语法和语义分析阶段将这些模式分为五类,如表1所示。
该分类主要根据编译器的原理及各阶段的分析对象来构建。编译器在处理程序时一般会通过语法分析和语义分析来保证程序的正确性,在这些阶段中,编译器会检查程序的不同方面。如在语法分析中会检查程序是否符合C语言的上下文无关语法,如果不符合就会产生语法错误,而使用未经声明的变量会导致语义错误。
通过对数据集观察,在语法分析阶段存在两种类型错误:结构错误和语句错误;
-
结构错误:语句或块中的分隔符(如"{", “}”, “,”)的误用或缺失;
-
语句错误:标记语句(labeled statement),表达式语句,选择语句或迭代语句中的错误标记
如:表达式语句“a = a + 1”缺少"1"
在语义分析阶段,将语义错误细分为三类:变量声明错误,类型匹配错误和标识符使用错误。
在语义分析阶段,编译器通过将代码结构及其之间的关系来构建语义,因此错误是针对具体的语义分析任务来识别的,如作用域解析和类型检查。
- 变量声明错误:在变量被声明之前使用;
- 类型匹配错误:不同数据类型之间的不兼容
如:函数f(a,b)只包含两个参数,但在使用时提供了三个参数f(a,b, c)
- 标识符使用错误:使用了错误的标识符(变量,函数名等)
如变量a被申明为int类型,但是在后续被当作指针使用了"a->t=0;"
表1同时包含了数据集中对不同类型错误的统计,其中一个程序可能同时存在多种类型的编译错误。
3.2 错误代码的合成
为了获得具有上述错误类别的错误程序,本文进一步设计了一种特定的扰动方法来破坏DeepFix中的正确代码。该方法基于每一行代码中的单个token,共包含三种基本操作:
- ADD:增加一个token
- DEL:删除一个token
- REP:替换一个Token
具体步骤:
- 给定一个程序,构建它的抽象语法树(AST),识别代码中的所有标记及标记的类型;
- 通过指定代码中发生的错误数量和错误类型来配置破坏过程,每个程序最多创造五个错误;
- 根据上一步指定的错误配置来破坏代码。具体来说:对于每个错误,首先对目标代码进行全局分析,然后根据破坏规则选择候选变量名或符号,最后从候选中选择一项(operand)进行最终替代。
如:为了生成一个语句错误,可以从AST中提取出关键字,运算符,变量类型或名称作为operand,然后执行三种操作之一(ADD,DEL,REP)。如果是替换操作,会根据具体的错误类型在上下文中找到符合的tokens,然后随机选择一个。
表1展示了扰动策略的详细信息。具体如下:
- 结构错误:在标点符号位置随机添加,删除或替换标点符号;
- 语句错误:在代码语句中随机添加,删除或替换关键词、操作符、变量类型或变量名;
- 变量声明错误:在变量声明/使用语句中添加变量类型或者变量名称;
- 类型匹配错误:在函数调用的参数列表中随机添加或删除变量类型或变量名称;
- 标识符使用错误:在声明语句中随机添加或删除运算符或变量名。
图3展示了扰动的具体示例。对于每个正确的程序重复执行代码合成过程50次来生成不同破坏程序并构建新的数据集。
4 数据解析
4.1 诊断反馈的提取
错误程序中可能包含多个错误,编译器可能返回多个错误信息,因此:
-
在模型训练阶段,考虑到所有这些错误
-
在模型验证阶段,执行迭代来连续修复每个错误,每次迭代使用报告的行号 i e r r i_{err} ierr和错误消息 m e r r m_{err} merr组成第一个错误。
此外,本文将函数名,变量名和自定义的结构体替换为标识符_funcN_
、_<varN>_
和_<typeN>_
进行规范化。N为索引表示第几个位置。
这些标识符的名称保留在映射表中,在修复完成时进行恢复。
4.2 上下文分析器
该分析器算法如下:
输入:程序文本 p p p和一个字典列表 L L L, 其中每个字典由一行代码语句 l i l_i li,该行语句的vars_declare和var_use列表,以及一个存储该行上下文信息的字典组成。
L L L的长度等于该程序文本的总行数
步骤:
-
设计一个词法分析器(函数ANALYZER)以程序文本 p p p作为输入,输出var_set(变量名称),func_set(函数名称)和type_set(类型名称)三个集合;
-
对于程序中的每一行,分析第一步所获得三个集合的并集中包含的每一个token,通过函数IS_DECLARE判断将其添加到vars_declare或vars_use中;
例如在变量名或者函数名前面有类型名,如int或float,或者在类型名前有struct或者typedef,则这个token就被添加到vars_declare中,反之则添加到vars_use中。
-
对于程序中的每一行提取上下文信息。
-
对于vars_use中的token,检索其最近的申明语句,通过函数GET_DECLARE_LINES构造有关vars_use中所有token的申明语句列表;
-
对于vars_declare中的token,检索其最近的使用语句。通过函数GET_USE_LINES构造有关来自vars_declare的所有标记的用法语句列表;
由于在申明过程中可能会存在诸如int a = b;之类的表达式语句,其中a是被申明的token,b是被使用的token,因此会同时检索b最近的使用语句与a最近的使用语句并进行组合。
-
-
连接声明上下文
(line[‘context'][‘declare’])
和使用上下文(line[‘context’][‘use’])
,进一步删除重复项并按照原始程序 p p p的顺序对它们进行排序,然后将其作为语句 l i l_i li的上下文 c i c_i ci。
5 程序修复
TransRepair的框架如图4所示。该模型基于Transformer框架,由三部分组成:
- 基于Transformer的编码器,用于对错误程序进行编码并获得每一行代码的向量表示
- 全连接前馈神经网络MLP,用于定位错误行
- 指针解码器,用于生成正确的修复语句
5.1 编码器
对于每一行
l
i
l_i
li,构建格式为(<BOS>
,
l
i
l_i
li, <sep>
,
c
i
c_i
ci , <sep>
,
m
e
r
r
m_{err}
merr, <EOS>
)的输入
s
i
s_i
si,将其输入到Transformer编码器来学习输入特征表示
H
i
∈
R
m
×
d
H_i\in\mathbb{R}^{m\times d}
Hi∈Rm×d,其中m为输入
s
i
s_i
si中的token数量,d为维度长度。公式表示如下:
H
i
=
E
n
c
o
d
e
r
(
s
i
)
H_i=\mathrm{Encoder}(s_i)
Hi=Encoder(si)
编码器架构由N个相同的层堆叠,每层包括两个子层(多头注意力层和全连接前馈网络)
在位置编码方面,将当前行号与报告错误的行号作偏移(即 Δ i = i e r r − i \Delta i=i_{err}-i Δi=ierr−i)来对当前行进行位置编码,并直接添加到 s i s_i si的嵌入向量中。
5.2 MLP
将定位问题转化为分类问题:
-
对于每一行序列 s i s_i si,提取在
<BOS>
位置处的向量 h i h_i hi,用该向量作为该行代码的聚合表示; -
使用一个包含两个全连接层和Softmax函数的分类器计算每一行的错误概率,并根据概率判断每个语句是否出错;
损失函数如下:
L l o c = − l o g exp ( h k ) ∑ i = 1 n exp ( h i ) \mathcal{L}_{\mathrm{loc}}=-\mathrm{log}\frac{\exp(h_k)}{\sum_{i=1}^n\exp(h_i)} Lloc=−log∑i=1nexp(hi)exp(hk)其中 k k k为该错误程序的实际错误行号, n n n为总行数
5.3 指针解码器
采用Transformer解码器,并进一步利用一个指针机制(pointer mechanism)从输入序列中复制tokens来克服OOV(out-of-vocabulary)问题。
-
对于MLP所找到的错误行的向量表示 H k ∈ R m × d H_k\in\mathbb{R}^{m\times d} Hk∈Rm×d( m m m是序列的长度),在每个解码步骤 t,Transformer解码器接收前面词的嵌入表示,并输出当前隐藏状态 s t ∈ R d s_t\in\mathbb{R}^d st∈Rd。
-
为了确定解码器在生成下一个词时应该关注输入序列的哪个部分,计算隐藏状态与 H k H_k Hk之间的注意力分布 a t ∈ R m a^t\in\mathbb{R}^m at∈Rm,计算公式如下:
a t = softmax ( H k s t d ) a_t=\text{softmax}\left(\frac{H_ks_t}{\sqrt{d}}\right) at=softmax(dHkst)
其中d为嵌入维度长度。 -
使用该注意力分布计算编码器隐藏状态的加权和,得到上下文向量(context vector) h t ∗ h_t^* ht∗,计算公式如下:
h t ∗ = ∑ i a t i h i h_t^*=\sum_ia_t^ih_i ht∗=i∑atihi
其中 h i h_{i} hi为 H k H_k Hk的的第i个向量。 -
将解码器隐藏状态 s t s_t st与上下文向量 h t ∗ h_t^* ht∗连接,生成词汇分布 P v o c a b P_{vocab} Pvocab,计算公式如下:
P v o c a b = s o f t m a x ( V ′ ( V [ s t ; h t ∗ ] + b ) + b ′ ) P_{\mathrm{vocab}}=\mathrm{softmax}(V'(V[s_t;h_t^*]+b)+b') Pvocab=softmax(V′(V[st;ht∗]+b)+b′)P v o c a b P_{vocab} Pvocab只包含了词汇表中已有词的概率,因此可能存在token存在于输入序列但不存在于词汇表中(OOV问题),本文进一步结合指针机制,允许模型直接从输入序列中复制词元并且在固定词汇表中生成词元。
-
对于每一步骤 t t t,其生成概率 p g e n ∈ [ 0 , 1 ] p_{\mathrm{gen}}\in[0,1] pgen∈[0,1]由上下文向量 h t ∗ h_t^* ht∗,解码器状态 s t s_t st以及解码器输入 x t x_t xt计算获得,计算公式如下:
p g e n = σ ( w h ∗ T h t ∗ + w s T s t + w x T x t + b p t r ) p_{\mathrm{gen}}=\sigma\begin{pmatrix}w_{h^*}^Th_t^*+w_s^Ts_t+w_x^Tx_t+b_{\mathrm{ptr}}\end{pmatrix} pgen=σ(wh∗Tht∗+wsTst+wxTxt+bptr)
其中 w h ∗ , w s , w x w_{h^{*}},w_{s},w_{x} wh∗,ws,wx和 b p t r b_{ptr} bptr是可学习的参数, p g e n p_{gen} pgen是决定从词汇表生成词元还是从输入序列中复制词元的概率。 -
在扩展词汇表(即原始词汇表与输入序列中的词元相结合)中,生成词元的概率为:
P ( w ) = p gen P vocab ( w ) + ( 1 − p gen ) ∑ i : w i = w a t i P(w)=p_\text{gen}P_\text{vocab}(w)+(1-p_\text{gen})\sum_{i:w_i=w}a_t^i P(w)=pgenPvocab(w)+(1−pgen)i:wi=w∑ati
损失函数如下:
L
g
e
n
=
−
1
T
∑
t
=
0
T
l
o
g
P
(
w
t
∗
)
\mathcal{L}_{\mathrm{gen}}=-\frac1T\sum_{t=0}^T\mathrm{log}P(w_t^*)
Lgen=−T1t=0∑TlogP(wt∗)
其中
w
t
∗
w_t^*
wt∗是时间步
t
t
t的目标词,
T
T
T是整个序列的长度。在训练阶段,将定位模型的损失与修复模型的损失直接相加作为总损失。
L
=
L
l
o
c
+
L
g
e
n
L=L_{\mathrm{loc}}+L_{\mathrm{gen}}
L=Lloc+Lgen
6 评估设置
6.1 数据集
如表2所示:
- 从DeepFix中破坏正确程序(37415个),获得1821275个用于训练的合成程序;
- 从TRACER的训练集(总共17688个)中随机挑选了2000个样本作为验证集;
- 分别在DeepFix 和TRACER的测试集上评估训练模型的性能,其中DeepFix中包括6971个没有正确答案的错误程序,TRACER中包括3647个单行错误程序(包括正确答案)
6.2 基线模型
-
DeepFix:首次采用序列到序列模型进行程序修复,将行号与该行语句连接起来作为带有注意力机制的RNN的输入,生成错误行号和修复语句,并且设计迭代策略来修复程序中的多个错误。
-
RLAssit:一种基于强化学习的编程语言校正框架,利用智能体(agent)模拟人类在编程时的操作行为,通过导航(navigation)和编辑代码来修复程序中的错误,该模型优于DeepFix。
-
SampleFix:一种深度生成模型,通过学习可能的修复方案的分布,来生成并应用修复程序错误的建议。核心是利用深度条件变分自编码器(Deep Conditional Variational Autoencoder, CVAE)来采样可能的修复方案,并通过引入新的正则化技术来鼓励生成更多样化的修复。
-
MACER:TRACER同一团队的后续工作(TRACER源代码未公开)。 该方法通过预测有限修复类别中的修复类型并将预测的修复应用于预测位置,将该问题表述为分类任务。
-
DrRepair:开创性将编译诊断反馈输入到模型中,取得了显著改进。具体而言,该方法构建了一个程序反馈图来建立错误程序和反馈之间的关系,模型架构由用于学习语句依赖性的双向LSTM和用于捕获程序与反馈之间关系的图注意网络组成,同时提出一种程序损坏程序来损坏DeepFix中的正确程序。
对于DeepFix、RLAssist和SampleFix,直接获取其原始论文中报告的实验数据;
对于MACER,利用官方发布的模型在TRACER测试集和DeepFix测试集上测试性能
对于DrRepair和TransRepair,分别使用DrRepair发布的数据集和本文构建的数据集来训练模型
6.3 指标
- 单行定位准确率(Single Localize):在TRACER测试集中定位错误语句行号的准确率
- 单行修复准确率(Single Repair):评估假设错误语句行号已知,生成的修复语句与目标正确语句是否匹配。使用Acc@k来计算top-k返回结果中存在正确结果的百分比,k设置为1,5,10。
- 全局修复准确率(Full Repair):用于评估不同方法修复错误程序的能力,包括定位错误行号和修复程序两部分,通过计算生成的能通过编译的程序占全部程序的百分比得到。
由于TRACER测试集中包括错误程序的正确修复,因此采用所有指标进行评估,而DeepFix测试集中不包括正确修复,因此只采用全局修复准确率进行评估。
6.4 模型配置
- TransRepair由Transformer编码器和解码器的5个相同层组成,每层有8个头来学习不同的子空间特征;
- 在训练集中选择出现频率大于1的token来构建词汇集,嵌入的单词维度设置为 256,位置编码等于 50
- 优化器:Adam、初始学习率:0.0001、batch size:25、dropout:0.1、梯度裁剪(gradient clipping):10
- 训练环境(训练时间约30小时):
- 服务器:8核Intel® Xeon®服务器
- 显卡:一块 Nvidia 3090(24GB) 和两块 Nvidia TITAN X(12GB)
7 评估结果
7.1 对比实验
结果如表3所示。
“{
*
}_ori”行表示在 DrRepair 发布的原始训练集上训练的模型 {*}。
-
TransRepair在TRACER测试集上的单次定位精度低于DrRepair:
- 推测原因:定位任务需要准确匹配错误行,基于Transformer的TransRepair在处理局部依赖关系方面不如基于LSTM的DrRepair,但是基于Transformer的TransRepair在生成目标序列方面比LSTM 更强大。
实验结论:与SOTA模型DrRepair相比,TransRepair 具有更高的修复精度(归功于 Transformer 强大的生成能力)。此外,通过比较 DrRepair使用的训练集和本文构建的训练集之间的性能,能够进一步确认本文构建的训练集更适合模型实现更高的性能。
7.2 各组件之间的消融实验
结果如表4所示。
实验结论:诊断反馈对于提高修复精度起着至关重要的作用,但是上下文信息和指针机制也有利于改进,当合并所有组件时,TransRepair 可以实现最佳性能。
7.3 数据集构建中扰动策略的消融实验
结果如表5所示。
-
实验方法:移除各类型的扰动策略并且补充其它新的训练代码以保证两次实验的训练数据集大小一致。
-
对结构错误类型进行扰动策略后对于模型获得更高修复精度方面贡献最小
- 推测原因:此类错误难以修复(与其他类型的破坏操作对比,标点符号不具有程序的语义信息)
-
对变量声明类型错误进行扰动策略后对于模型获得更高修复精度方面贡献最大
- 推测原因:归功于上下文分析器(见4.2),它可以提取这些变量的上下文信息,这对于模型学习有效的修复模式非常有益。
实验总结:每种类型的扰动策略都有利于构建多样化的训练集。当将它们组合在一起并将它们应用于损坏的正确程序来构建训练集时,可以获得最佳的修复精度。
7.4 TransRepair何时失效,何时有效?(When TransRepair fails and when it works)
进一步统计分析来比较TransRepair 和 DrRepair 的修复结果。这两个模型都在本文构建的数据集上进行训练,并在 TRACER 测试集上进行测试。统计结果如图5所示,其中矩形旁边的数字是成功修复数量以及成功修复数量与该类型错误总数的比值。
-
TransRepair在修复“变量声明(decl)”和“类型不匹配(tm)”错误方面表现出色,在修复“结构(struct)”和“语句(stmt)”错误方面略有改进,在修复“标识符误用(im)”错误方面与DrRepair相比稍逊一筹。
- 原因分析:DrRepair构建的程序反馈图能来捕获变量关系,因此可以修复更多的“标识符误用(im)”错误;TransRepair可以比DrRepair更好地修复的其他四个错误,将改进归因于所使用的上下文帮助模型捕获错误语句模式。
-
举例说明:如图6所示。
- 错误原因:第5行的n未定义;
- 上下文信息:蓝色标记的第3行和第6行
- TransRepair修复:将错误行(第5行)的上下文(第3行和第6行)信息进行编码,从而生成正确代码
- DrRepair修复:缺乏上下文信息,DrRepair未能正确生成修复代码
实验结论:与DrRepair相比,TransRepair在“修复类型不匹配”错误方面具有竞争力,但是在其他四个错误上,它可以实现更好的性能,这种改进归因于所使用的学习上下文。
8 效度威胁
8.1 内部效度
- 超参数的设置:我们在验证集上调整模型,并根据修复精度选择最佳模型并将其用于测试,将来会探索更多的超参数;
- 代码合成,上下文分析器和模型的实现:作者仔细检查了实现的正确性,并公开我们的代码和构建的数据集以供参考;
8.2 外部效度
- 所选数据集:
- 根据在C语言程序修复领域中流行的DeepFix数据集进行构建;
- 只使用三个操作(添加,删除,替换)来破坏代码;
- 选择用于评估C语言程序修复的测试集(TRACER和DeepFix);
- 目前不支持Java等其他语言,未来将通过针对其他语言的自适应语言分析器来扩展本文方法;
- 面对复杂系统的程序性能可能下降,但是该方法对于人工智能编程(例如自动代码完成)仍然有效;
- 基线评估
- 对于 DeepFix、RLAssist 和 SampleFix,直接采用了原始论文中的实验数据,我们相信这些数据最适合他们的方法
- 对于MACER,我们也认为他们发布的模型是最优的
- 对于DrRepair,除了将beam search size缩小至5以外,其他设置与默认设置一致
- 评估指标
- 遵循 DrRepair中采用的评估指标,利用单次定位精度、单次修复精度(在本文中为 Acc@1)、完全修复精度进行评估。并进一步添加Acc@5和Acc@10进行综合评估。
9 结论
不足
- 修复语言的单一性,目前只能对C语言进行程序修复,并且在面对较为复杂的程序时可能出现没见过的编译诊断反馈从而导致性能下降
启发
-
数据集的质量对于模型的训练存在较大影响,构建高质量数据集需要对错误程序的错误类型进行合理设定(本文从编译器的编译视角考虑,分为语法分析和语义分析,再进一步划分五类错误类型)
-
上下文信息对程序修复具有较大帮助,如何提取并利用上下文信息是模型改进的重要方向(本文提出了一种上下文信息的采集算法并直接将其补充到每一行代码的语句内容后面作为编码器输入的一部分)
BibTex
@inproceedings{li2022transrepair, title={Transrepair: Context-aware
program repair for compilation errors}, author={Li, Xueyang and Liu,
Shangqing and Feng, Ruitao and Meng, Guozhu and Xie, Xiaofei and Chen,
Kai and Liu, Yang}, booktitle={Proceedings of the 37th IEEE/ACM
International Conference on Automated Software Engineering},
pages={1–13}, year={2022} }