TransRepair

news2024/12/30 3:33:57

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

具体步骤:

  1. 给定一个程序,构建它的抽象语法树(AST),识别代码中的所有标记及标记的类型;
  2. 通过指定代码中发生的错误数量和错误类型来配置破坏过程,每个程序最多创造五个错误;
  3. 根据上一步指定的错误配置来破坏代码。具体来说:对于每个错误,首先对目标代码进行全局分析,然后根据破坏规则选择候选变量名或符号,最后从候选中选择一项(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的长度等于该程序文本的总行数

步骤:

  1. 设计一个词法分析器(函数ANALYZER)以程序文本 p p p作为输入,输出var_set(变量名称),func_set(函数名称)和type_set(类型名称)三个集合;

  2. 对于程序中的每一行,分析第一步所获得三个集合的并集中包含的每一个token,通过函数IS_DECLARE判断将其添加到vars_declare或vars_use中;

    例如在变量名或者函数名前面有类型名,如int或float,或者在类型名前有struct或者typedef,则这个token就被添加到vars_declare中,反之则添加到vars_use中。

  3. 对于程序中的每一行提取上下文信息。

    • 对于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最近的使用语句并进行组合。

  4. 连接声明上下文(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} HiRm×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=ierri)来对当前行进行位置编码,并直接添加到 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=logi=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} HkRm×d( m m m是序列的长度),在每个解码步骤 t,Transformer解码器接收前面词的嵌入表示,并输出当前隐藏状态 s t ∈ R d s_t\in\mathbb{R}^d stRd

  • 为了确定解码器在生成下一个词时应该关注输入序列的哪个部分,计算隐藏状态与 H k H_k Hk之间的注意力分布 a t ∈ R m a^t\in\mathbb{R}^m atRm,计算公式如下:
    a t = softmax ( H k s t d ) a_t=\text{softmax}\left(\frac{H_ks_t}{\sqrt{d}}\right) at=softmax(d Hkst)
    其中d为嵌入维度长度。

  • 使用该注意力分布计算编码器隐藏状态的加权和,得到上下文向量(context vector) h t ∗ h_t^* ht,计算公式如下:
    h t ∗ = ∑ i a t i h i h_t^*=\sum_ia_t^ih_i ht=iatihi
    其中 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=σ(whTht+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)+(1pgen)i:wi=wati

损失函数如下:
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=0TlogP(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 内部效度
  1. 超参数的设置:我们在验证集上调整模型,并根据修复精度选择最佳模型并将其用于测试,将来会探索更多的超参数;
  2. 代码合成,上下文分析器和模型的实现:作者仔细检查了实现的正确性,并公开我们的代码和构建的数据集以供参考;
8.2 外部效度
  1. 所选数据集:
    • 根据在C语言程序修复领域中流行的DeepFix数据集进行构建;
    • 只使用三个操作(添加,删除,替换)来破坏代码;
    • 选择用于评估C语言程序修复的测试集(TRACER和DeepFix);
    • 目前不支持Java等其他语言,未来将通过针对其他语言的自适应语言分析器来扩展本文方法;
    • 面对复杂系统的程序性能可能下降,但是该方法对于人工智能编程(例如自动代码完成)仍然有效;
  2. 基线评估
    • 对于 DeepFix、RLAssist 和 SampleFix,直接采用了原始论文中的实验数据,我们相信这些数据最适合他们的方法
    • 对于MACER,我们也认为他们发布的模型是最优的
    • 对于DrRepair,除了将beam search size缩小至5以外,其他设置与默认设置一致
  3. 评估指标
    • 遵循 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} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt-17不规则窗体

不规则窗体 知识点shape.hshape.cppmain.cpp运行图 知识点 感觉这个就是在图片背景 贴了白色 shape.h #ifndef SHAPE_H #define SHAPE_H#include <QWidget>class Shape : public QWidget {Q_OBJECTpublic:Shape(QWidget *parent nullptr);~Shape(); protected:void m…

【开源社区】Elasticsearch(ES)中 exists 查询空值字段的坑

文章目录 1、概述2、使用 null_value 处理空值3、使用 exists 函数查询值为空的文档3.1 使用场景3.2 ES 中常见的空值查询方式3.3 常见误区3.4 使用 bool 查询函数查询空值字段3.5 exists 函数详解3.5.1 bool 查询的不足3.5.3 exists 的基本使用 3.6 完美方案 1、概述 本文主要…

环网交换机 环网数采仪 环网采集器确保数据传输无懈可击!

计讯物联Pro级双向防护&#xff0c;升级环网采集器确保数据传输无懈可击&#xff01; 在物联网(IoT)的世界里&#xff0c;数据流动如同城市交通&#xff0c;需要高效且可靠的网络来支撑。但就像城市交通可能遇到意外拥堵或道路封闭&#xff0c;传统网络在数据传输上也会遇到障…

Redis RDB三两事

rdb&#xff1a;将数据库的快照以二进制格式保存在文件中&#xff0c;redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则&#xff0c;例如 save 60 1000 如果60秒内不少于1000个key发生了改动&#xff0c;则生成一个新的rdb文件…

苹果电脑能玩Steam游戏吗?Steam对苹果笔记本要求高吗 steam苹果下载安装教程

对于游戏爱好者而言&#xff0c;如何在Mac上安装并使用Steam玩游戏成为一个重要的问题&#xff0c;Steam作为全球最大的数字发行平台和游戏社区&#xff0c;为玩家提供了丰富的游戏资源和社交交流平台。然而&#xff0c;由于Mac和Windows系统之间存在差异&#xff0c;很多人不确…

Linux进程间通信方式对比

参考&#xff1a; Linux进程间通信总结-百度开发者中心 Linux操作系统提供了多种进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;每种方式都有其独特的应用场景和优缺点。下面将对Linux下的进程间通信方式进行总结和比较。 管道&#xff08;Pipe&#xff09; 管道是最…

小白学大模型:GLM 调用教程

最近这一两周看到不少互联网公司都已经开始秋招提前批面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些…

计算机网络:DNS、子网掩码、网关

参考&#xff1a; https://blog.csdn.net/weixin_55255438/article/details/123074896 https://zhuanlan.zhihu.com/p/65226634 在计算机网络中&#xff0c;DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;、子网掩码&#xff08;Subnet Mask&#xff09;…

优化RoBERTa:在AMD上使用混合精度进行微调

Optimizing RoBERTa: Fine-Tuning with Mixed Precision on AMD — ROCm Blogs 简介 在这篇博客中&#xff0c;我们将探讨如何微调鲁棒优化的BERT预训练方法&#xff08;[RoBERTa](https://arxiv.org/abs/1907.11692)&#xff09;大型语言模型&#xff0c;重点在于PyTorch的混…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …

Java类的加载器分类

启动类加载器 使用-XX:TraceClassLoading参数得到 扩展类加载器 应用程序类加载器 用户自定义类加载器 测试不同类的加载器

高性能web服务器--nginx

下载nginx [rootnginx ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz创建nginx用户 [rootnginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx先安装依赖 dnf install gcc pcre-devel zlib-devel openssl-d…

来了...腾讯内推的软件测试面试PDF 文档(共107页)

不多说&#xff0c;直接上干货&#xff08;展示部分以腾讯面试纲要为例&#xff09;完整版文末领取 通过大数据总结发现&#xff0c;其实软件测试岗的面试都是差不多的。常问的有下面这几块知识点&#xff1a; 全网首发-涵盖16个技术栈 第一部分&#xff0c;测试理论&#x…

C++:平衡二叉搜索树之红黑树

一、红黑树的概念 红黑树&#xff0c; 和AVL都是二叉搜索树&#xff0c; 红黑树通过在每个节点上增加一个储存位表示节点的颜色&#xff0c; 可以是RED或者BLACK&#xff0c; 通过任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树能够确保没有一条路径会比…

黑马头条vue2.0项目实战(九)——编辑用户资料

目录 1. 创建组件并配置路由 2. 页面布局 3. 展示用户信息 4. 修改昵称 5. 修改性别 6. 修改生日 7. 修改头像 7.1 图片上传预览 7.2 使用纯客户端的方式处理用户头像上传预览 7.3 头像裁切 7.4 纯客户端的图片裁切上传流程 7.5 Cropper.js 图片裁剪器的基本使用 …

盘点.软件测试工程师常见的面试题。面试官说我要定你了!

今天我们来聊聊软件测试工程师的面试题有哪些&#xff0c;2024年的8月份马上就过完了&#xff0c;金九银十就业季&#xff0c;跳槽季马上又要来了&#xff0c;毕竟在面试的战场上&#xff0c;知己知彼方能百战不殆。嗯嗯&#xff0c;不错说的真好&#xff01; 1、您所熟悉的测试…

24/8/15算法笔记 项目练习冰湖

import gym from matplotlib import pyplot as plt %matplotlib inline import os os.environ[SDL_VIDEODRIVER]dummy #设置环境变量 SDL_VIDEODRIVERdummy 是在使用基于 SDL (Simple DirectMedia Layer) 的应用程序时&#xff0c;告诉应用程序不使用任何视频驱动程序。这通常…

云计算实训29——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、mycat读写分离实现

一、mysql主从复制及同步 1、mysql主从自动开机同步 2、配置mysql5.7版本 mysql-5.7.44-linux-glibc2.12-x86_64.tar 启动服务、登录 对数据库进行基本操作 3、使用python操纵mysql数据库 4、编辑python脚本自动化操纵mysql数据库 二、mycat读写分离实现 1.上传jdk和mycat安装…

【C语言】双链表

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、什么是双链表&#xff1f; 二、双链表温习 1. 双链表的结构…

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布&#xff0c;其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划&#xff0c;并将其大小限制从 32GB 提高到 2TB。与此同时&#xff0c;沙盒也得到了改进。让我们来详细了解一下此次更新。 …