Page 106 - 《软件学报》2025年第4期
P. 106

1512                                                       软件学报  2025  年第  36  卷第  4  期


                 库, 例如一个包含     40  个经典编程问题的多语言缺陷数据库            QuixBugs [146] , 以及包含从  9  个开源项目中收集的   185
                 个错误基于    C  语言的缺陷数据库      ManyBugs [147] .
                    ● 缺陷定位: 缺陷定位是修复流程中的首要步骤, 并且缺陷定位的有效性及准确性极大影响缺陷自动修复的
                 效果. 因此, 缺陷定位技术引起了研究者的广泛关注, 并主要分为                  3  个技术流派: 基于切片     [148,149] 、基于频谱  [150,151]
                 以及基于统计的      [152,153] 定位技术. 其中, 基于频谱的缺陷定位技术由于能够在语句级别定位错误, 在自动修复系统
                 中得到广泛的应用. 该技术依赖于排名指标              (例如  Trantula [154] 、Ochiai [155] ) 来计算每个语句的可疑性. 由于在多项
                 实证研究中已经证明了它们的有效性, GZoltar         [156] 和  Ochiai 被广泛整合到自动修复系统中   [157−160] . 然而正如  Liu 等人  [161]
                 论文中所阐述: 这种缺陷定位技术的配置仍然存在定位错误位置准确性和有效性上的局限. 因此, 研究人员试图使
                 用新技术来增强错误定位技术, 如谓词切换             [162,163] 和测试用例净化  [164,165] . 值得一提的是, 近期已有一篇基于大模型
                 的缺陷定位工作发表       [166] . 该工作通过在已有大模型基础上微调一系列双向适配器层以实现缺陷定位, 并在性能评
                 估中取得了高于最佳基线工作的效果. 由于缺陷定位是一个独立的研究领域, 其中相关工作繁多, 而且和软件缺陷
                 自动修复技术解耦, 在本节中我们只在此做简要介绍, 更多工作进展请参考相关论文及综述                            [167−169] .
                    ● 补丁生成: 补丁生成模块是自动修复系统的核心. 目前传统的补丁生成技术可以分为                           3  类: 基于启发式搜索
                    根据补丁生成的方式, 传统软件缺陷修复技术可以分为
                 的、基于约束的以及基于模板的技术. 其中, 基于启发式搜索的技术主要依赖人类专家应用遗传算法为搜索修复
                 补丁制定的启发式规则, 基于约束的技术采用约束求解器进一步提高补丁生成效率, 基于模板的技术依赖于人类
                 专家对缺陷特征进行分类并专门编写对应的修复模板. 后续研究者尝试应用机器学习和深度学习等技术到缺陷修
                 复任务上, 提出了基于学习的缺陷自动修复技术. 在该技术中, 研究者使用神经机器翻译                         (neural machine translation,
                 NMT) 技术进一步提升了缺陷修复的效果. 然而, 基于学习的技术也面对诸多挑战. 诸多研究的实验结果显示, 在
                 给定正确缺陷位置的前提下, 已有的自动修复方法仅能修复小部分程序缺陷                         [170] . 因此目前的缺陷自动修复系统面
                 临的核心挑战是如何高效正确地生成补丁. 而大模型在这一方面展现出优异的性能: 在近期                              Xia 等人  [171] 的研究
                 中, 使用预训练大语言模型        CodeX  生成修复补丁达到了领域中最好的修复效果, 并且耗时上也远远优于传统技术.
                 故大量研究者尝试进一步开发利用模型的修复能力. 各个技术的代表工作会在第                          5.2  节和第  5.3  节中介绍.
                    ● 补丁验证: 当拥有易于验证修复的缺陷数据库后                (例如, Defects4J), 自动程序修复领域广泛应用生成和验证
                 (G&V) 模型, 该模型首先利用故障定位技术缩小搜索空间, 然后生成候选修复补丁, 并通过测试套件对其进行编
                 译和验证. 然而, 由于测试的覆盖范围不全面, 即使补丁通过了所有测试                     (称为可信补丁), 该补丁在其他输入下可
                 能仍然存在失败的情况, 因此需要进一步的人工检查以确定最终正确的补丁. 然而, 由于需要反复执行测试, 该方
                 式的修复效率较低, 通常需要几十分钟到几个小时来修复一个程序缺陷, 从而限制了其在线使用和实时反馈的能
                 力. 虽然一些研究已经尝试通过不同的方法提升修复效率, 如避免重复补丁的验证过程、通过补丁排序筛选正确
                 的修复补丁、以及通过补丁隔离和字节码修复来避免代码反复编译的开销                          [172] , 但自动修复方法仍难以满足开发
                 者对高效进行缺陷修复的需求, 修复效率仍是自动修复方法面临的核心挑战.
                    综上, 本文主要针对缺陷自动修复中的补丁生成技术在第                   5.2  节和第  5.3  节进行详细的分析和探讨. 对于另外
                 两个模块以及缺陷数据库的相关内容, 受限于篇幅, 本文不展开论述. 更多信息可以参考相关的综述论文                               [1,167−169,173] .

                 5.2   传统和基于学习的缺陷自动修复技术
                                                                3  类: 基于启发式搜索的、基于语义约束的和基于模
                 板的缺陷自动修复技术. 进而, 研究人员尝试将深度学习和强化学习等技术应用于缺陷自动修复任务中, 我们将其
                 归纳为基于学习的缺陷自动修复技术. 在本小节中, 我们将首先简要介绍各个传统技术的代表工作, 然后进一步分
                 析不同技术所面对的关键挑战.

                 5.2.1    基于启发式搜索的缺陷自动修复技术
                    基于启发式搜索的缺陷自动修复技术应用遗传算法, 并利用人工定义的启发式规则, 通过变异生成通过所有
                 测试用例且不存在特定缺陷的程序补丁从而自动修复软件缺陷. 其中                       GenProg  [174] 是一个经典的基于启发式搜索
                 的技术. 为解决遗传变异算法补丁搜索空间过大的问题, GenProg                仅在抽象语法树      (abstract syntax tree, AST) 级别
   101   102   103   104   105   106   107   108   109   110   111