关于基于深度学习的自动补丁正确性评估中代码表示的有效性
摘要
自动程序修复(APR)旨在生成正确的补丁,在过去几十年中引起了学术界和工业界的广泛关注。然而,由于测试套件薄弱,APR 一直面临着补丁过拟合的问题,即生成看似合理但实际上过拟合的补丁。因此,为了解决过拟合问题,学术界提出了越来越多的自动补丁正确性评估(APCA)方法。其中,利用深度学习方法预测补丁正确性的技术近年来逐渐兴起。这类方法通常将补丁代码片段编码为精心设计的表示形式(例如手工设计的特征),并构建一个二分类模型进行正确性预测。尽管代码表示对于推理补丁正确性至关重要,但该领域尚未得到系统性的研究,其优缺点也鲜为人知。

为了填补这一空白,我们首次开展了大规模研究,评估不同代码表示在预测补丁正确性方面的性能,涉及超过 500 个训练好的 APCA 模型。针对来自四个类别的 15 种表示和 11 种分类器的实验结果表明,在文献中尚未被充分探索的基于图的表示,其表现始终优于其他表示,例如,结合三种图神经网络模型,基于代码属性图(CPG)的表示平均准确率达到 82.69%。此外,我们证明此类表示可以达到与先前 APCA 方法相当或更优的性能,例如,使用基于抽象语法树(AST)训练的树形长短期记忆网络(TreeLSTM)可以过滤掉 87.09% 的过拟合补丁。我们进一步探索了融合不同类型表示的能力与局限性,发现将基于序列的表示融入基于启发式的表示,能够在五项指标上平均提升 13.58% 的性能。此外,我们还针对性能优异的基于图的表示中的节点嵌入进行了补充讨论,并指出在学习补丁语义时,节点文本信息比节点类型信息更为关键。基于这些发现,我们最终为基于表示的高级 APCA 研究提出了实用指南,例如结合更多的表示形式。总的来说,我们的研究凸显了利用代码表示来推理补丁正确性的潜力与挑战,从而提高了现有 APR 工具的可用性,并减少了开发者在实际中的手动调试工作量。

1. 引言
在现代软件系统的维护与演进过程中,软件缺陷不可避免,并可能导致严重后果(Wang et al., 2017; Zhang et al., 2022a)。随着软件系统数量和复杂性的日益增长,开发者手动修复检测到的缺陷变得越来越耗时耗力(Hossain, 2018)。例如,先前的研究(Britton et al., 2013)表明,开发者通常会将 50% 的时间花费在软件调试和修复上。为了减轻手动调试的负担,自动程序修复(APR)应运而生,旨在无需人工干预的情况下自动生成正确的补丁,并已受到学术界和工业界的广泛关注(Gazzola et al., 2019; Zhang et al., 2023a)。在过去几十年中,大量 APR 方法被提出,并在正确修复缺陷的数量上取得了实质性进展,这些方法包括基于启发式的、基于约束的、基于模式的和基于学习的方法(Monperrus, 2018; Le Goues et al., 2012; Liu et al., 2019b; Li et al., 2020; Yuan et al., 2022)。
然而,由于程序规约不充分,APR 领域从根本上受到了补丁过拟合问题的挑战(Smith et al., 2015; Le et al., 2019; Liang et al., 2021; Motwani et al., 2022; Motwani and Brun, 2023)。具体而言,现有的 APR 方法通常采用“生成-验证”范式,即生成候选补丁,并利用开发者编写的测试用例来识别正确的补丁(Zhang et al., 2023a)。在这种情况下,那些能通过现有测试用例的候选补丁会被返回,但它们可能无法推广到其他潜在的测试用例上,从而导致补丁过拟合。先前的研究(Tao et al., 2014; Zhang et al., 2022b)表明,开发者过滤掉过拟合补丁可能需要耗费大量的时间和精力,这阻碍了现有 APR 工具在实际调试场景中的实用性。

因此,为了解决补丁过拟合问题,研究人员提出了各种自动补丁正确性评估(APCA)方法,以判断一个看似合理的补丁是否确实正确(Tan et al., 2016; Xiong et al., 2018; Xin and Reiss, 2017a; Yang and Yang, 2020; Le et al., 2017; Dong et al., 2024; Ismayilzada et al., 2023)。传统的 APCA 技术根据提取的特征可分为两类:静态方法和动态方法。静态方法尝试基于语法和语义特征分析代码变更模式或代码相似性。例如,Tan 等人(Tan et al., 2016)为缺陷程序定义了一组通用的禁止转换(例如删除功能)。相比之下,动态方法通常针对由自动化测试生成工具生成的额外测试用例来执行候选补丁。例如,Xiong 等人(Xiong et al., 2018)生成新的测试用例,并基于执行轨迹的相似性来识别过拟合补丁。然而,静态技术可能面临识别精度不高的问题,而动态技术则需要大量时间来收集运行时信息(Wang et al., 2020)。
近年来,受深度学习(DL)进展的启发,越来越多的基于学习的 APCA 技术被提出来直接预测补丁的正确性(Ye et al., 2022; Tian et al., 2020, 2022b, 2023, 2022a; Lin et al., 2022; Zhang et al., 2024a; Le-Cong et al., 2023; Ghanbari and Marcus, 2022)。与传统的 APCA 不同,基于学习的 APCA 能够从补丁基准语料库中学习正确补丁与过拟合补丁之间的关系,因此获得了迅速增长的关注(Wang et al., 2020; Yang et al., 2023)。这类技术通常将 APCA 问题视为一个代码分类任务,采用两阶段预测流程:一个特征提取器和一个二分类器。特征提取器首先提取补丁代码片段的隐藏特征,然后二分类器利用提取的特征进行补丁正确性预测。例如,Ye 等人(Ye et al., 2022)从 Java 程序中静态提取手工设计的特征,并训练一个概率模型来执行补丁正确性预测。此外,Tian 等人(Tian et al., 2020)通过将源代码表示为令牌序列,研究了嵌入特征以构建预测模型的可行性。进一步地,Lin 等人(Lin et al., 2022)利用抽象语法树(AST)来表示补丁代码片段,以训练补丁分类器。得益于精心构建的代码表示和强大的深度学习模型,基于学习的 APCA 技术在过去几年中取得了令人鼓舞的成果(Zhang et al., 2023a; Yang et al., 2023)。

本文研究。 尽管这是一个新兴的研究领域,但 APCA 领域已经出现了多种精心设计的、用于编码补丁代码片段的代码表示方法,例如基于启发式的(Ye et al., 2022)、基于序列的(Tian et al., 2020)和基于树状结构的特征(Lin et al., 2022)。代码表示对于学习程序语义和推理补丁正确性至关重要且是基础性的,并且已在各种代码理解任务中得到了广泛研究(Siow et al., 2022; Sun et al., 2023; Namavar et al., 2022; Utkin et al., 2022)。然而,现有文献尚未提供关于如何为补丁正确性评估任务表示源代码的系统性评估。关于 APCA 中的代码表示,目前存在几个未解决的挑战:(1)在补丁正确性评估场景中,哪种类型的代码表示是最优的?(2)尽管基于启发式、基于序列和基于树状结构的方法已展现出优越性,但基于图的方法仍未得到充分探索。(3)这些不同的表示能否被整合以进一步提高预测效果?在本文中,为了填补这一空白,我们研究了利用不同代码表示方法来预测补丁正确性的可行性,并为后续的 APCA 研究提供便利。基于上述挑战,我们旨在解决以下三个研究问题(RQ):RQ1 分析不同表示的影响;RQ2 回答与现有先进方法的性能比较;RQ3 探索基于融合的方法的潜力。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)