Page 266 - 《软件学报》2024年第4期
P. 266

1844                                                       软件学报  2024  年第  35  卷第  4  期


                 类型缺陷定位方法的定位结果进行融合, 得到更为准确的结果; Lou                   等人  [31] 设计了面向缺陷定位的图结构程序表
                 示方法, 在抽象语法树基础上引入测试用例与程序语句间的覆盖关系, 并用门控图神经网络                              (gated graph neural
                 network) 进行特征学习并对程序语句进行排序; 为解决正例与负例                (即通过的测试用例与失效的测试用例) 数量不
                 均衡的问题, Xie 等人    [32] 尝试通过自编码器    (auto-encoder) 自动生成合理的负例样本, 提升基于机器学习的缺陷定
                 位方法的定位效果. 也有学者提出          [33] , 可以利用变量的运行时信息优化对包含数字、字符等类型的变量的赋值语
                 句可疑度的计算过程.
                    尽管缺陷定位技术有较长的研究历史, 最先进的定位技术也仅能在代码语句的粒度上定位缺陷的位置. 因此
                 在一些针对开发人员的调查显示, 现有的缺陷定位技术并没有受到他们的欢迎. Parnin                        等人  [2] 发现自动调试技术
                 做出的一些假设      (例如, “对开发人员来说, 检查一条独立的错误语句就足够了”) 对开发人员的实践来说并不成立.
                 Xie 等人  [34] 发现简单地为开发人员提供可疑代码语句的排名实际上会降低他们的调试效率. Kochhar 等人                       [35] 发现
                 迄今为止最流行的缺陷定位粒度            (即方法级别) 仅获得了大约一半的被调查者的认可. 我们的工作针对缺陷语句
                 中的导致缺陷的代码令牌进行识别, 从而为程序调试提供更细粒度的缺陷定位结果.
                  1.2   缺陷自动修复
                    缺陷自动修复旨在将补丁生成的过程自动化, 使开发人员摆脱手动调试的沉重负担. 缺陷自动修复流程以缺
                 陷定位为起始步骤, 在获取到可能的缺陷位置后尝试不同的补丁生成策略生成并验证补丁, 最终输出能够通过验
                 证的补丁. Liu  等人  [36] 指出, 现有缺陷自动修复工具的修复能力在一定程度上受到了缺陷定位工具的制约. 因此,
                 研究人员提出利用不同的方法对缺陷定位结果进行优化. 例如, SimFix                  [37] 应用测试用例提纯的方法将一个测试用
                 例拆分为多个测试用例从而更加充分地暴露缺陷位置.
                    长久以来, 缺陷自动修复领域的研究人员们探索了多种补丁生成的方法. 作为缺陷自动修复领域的里程碑,
                 GenProg [38] 借助于基因编程的思想, 通过变异生成一代又一代种子程序, 利用种子程序成功运行测试用例的数量衡
                 量种子质量, 直至变异出能够成功通过所有测试用例的补丁. 在此基础上涌现出了各种缺陷自动修复技术, 根据补
                 丁生成方法的不同, 大致可以分为          4  类: 基于启发式、基于约束、基于修复模板和基于学习的修复方法. 基于启发
                 式的修复方法构建满足语法规约的程序搜索空间并在其中对可能的补丁进行搜索, 代表工作有利用相似代码对搜
                 索空间进行限制的       SimFix [37] 以及为修复动作与缺陷修复历史数据相匹配的补丁赋予更高优先级的                    HDRepair [39] .
                 基于约束的修复方法通常利用特定技术              (例如约束求解) 来推断给定缺陷程序的约束, 这些约束被进一步用于指
                 导补丁的生成和验证, 代表工作有利用测试用例信息刻画约束条件的                       SemFix [40] 以及利用轻量级约束条件显著提
                 升此类方法的可扩展性的         Angelix [41] . 基于修复模板的修复方法总结从现实世界的补丁中识别出的修复模板, 这些
                 模板可以为缺陷修复的代码更改行为提供具体的指导, 辅助机器生成与现实世界中的补丁更为相似的补丁, 代表
                 工作包括融合了      35  种代码变更模式的     TBar [42] 和利用静态分析工具总结可靠的、多样的修复模式的              AVATAR  [43] .
                 近几年来, 也有部分工作关注于用学习的方法生成补丁, 将补丁生成的过程视为从缺陷代码到正确代码的转换过
                 程. 例如, CoCoNut [44] 提出根据上下文信息采用集成学习的方式将缺陷语句翻译为正确语句; CURE                    [45] 提出在解码
                 器一段增加约束条件, 提高翻译出正确语句的概率; Allamanis                 等人  [46] 使用图神经网络解决程序中变量误用
                 (variable-misuse bugs) 的问题; Bhatia 等人  [47] 关注于小规模学生程序中的语法错误问题; Codit    [48] 使用基于抽象语
                 法树的模型以便捕获代码中的结构信息并保证生成的补丁的语法正确性; Recoder                       [49] 通过预测对代码的编辑操作
                 而非直接生成补丁代码使模型对小规模的代码变换更加有效, 并通过生成占位符使补丁包含项目专有的标识符,
                 有效解决训练集中词汇表的局限问题.
                    尽管程序修复技术已被广泛研究, 其仍旧面临一个重要的问题: 补丁过拟合                       [4−8] . 具体而言, 现有技术无法保证
                 工具生成的通过整个测试套件的补丁是语义正确的. ACS                 [50] 针对条件语句运用变量依赖分析、自然语言处理、谓
                 词选择等技术, 实现了      78%  的准确率; CapGen [51] 将缺陷代码的上下文信息纳入考虑, 计算缺陷位置处代码与项目
                 其他地方代码的相似度来选取可用于修复的原料, 实现了                   84%  的准确率. 然而, 它们的效果离理想的准确度还有
                 一定距离. 我们的研究通过为缺陷自动修复提供细粒度的缺陷定位信息, 在两种不同的修复策略上均实现了百分
                 之百的准确率, 展示了细粒度缺陷定位可行性.
   261   262   263   264   265   266   267   268   269   270   271