Page 270 - 《软件学报》2024年第4期
P. 270
1848 软件学报 2024 年第 35 卷第 4 期
P op 是模型输出的该条操作路径的权重. 在模型训练过程中, 我们
其中, Y op = {1,0} 表示该条操作路径是否为正例,
使用 Adam 方法来降低上述式子中的 Loss 值.
3.3 在线预测
当模型经过训练后, 就可以用来预测给定缺陷函数的操作路径. 首先在缺陷函数中提取所有指向叶子节点的
抽象语法树路径, 并为每条抽象语法树路径交替分配 3 个操作运算符中的每一个, 从而为该缺陷方法生成所有可
能的操作路径. 随后根据第 3.2 节中介绍的操作路径编码方法为每条操作路径获取向量表示形式, 在将这些操作
路径送入训练好的模型后, 模型即可返回预测结果 (即按照权重排序的操作路径列表), 对返回的预测结果进行解
析即可获取预测到的缺陷令牌、缺陷位置以及修复该缺陷所需进行的代码修改操作信息.
4 实验分析
本节首先介绍了着重研究的 3 个问题、实验所用的数据集和评价标准, 然后设计实验对本文的方法进行验证
并对实验结果进行分析讨论.
4.1 研究问题
为了评估基于指针神经网络的细粒度缺陷定位方法的有效性, 我们研究了以下 3 个问题.
• RQ1: BEEP 能否有效识别出真实程序中的缺陷代码令牌?
• RQ2: BEEP 能否准确地同时预测缺陷代码令牌及修复缺陷代码令牌所需进行的代码修改操作?
• RQ3: 不同的模块对 BEEP 方法的有效性产生怎样的影响?
4.2 实验数据集
为了训练我们提出的神经网络模型, 我们收集了来自 CoCoNut [44] 工具训练集中的补丁; 为了评估我们模型的
效果, 我们收集了来自 ManySStuBs4J [61] 和 Defects4J [10] 数据集中的补丁. 这些数据集被我们的研究所采用的原因
在于: (1) CoCoNut 和 ManySStuBs4J 都是大规模补丁数据集, 用它们可以很好地检验我们模型的泛化能力; (2)
Defects4J 数据集是软件缺陷自动修复领域最常用的基准数据集. 我们对数据集中的案例进行了去重, 并且由于我
们的研究关注于源代码中的缺陷定位, 我们移除了跟测试代码相关的补丁. 最终, 我们选用的 3 个数据集分别包含
436 676, 26 406, 以及 393 个缺陷.
4.3 评价指标
在评估方法的定位效果时, 我们使用两个指标进行度量.
recall@Top-n 是在缺陷定位中常常被使用的评价指标 [30,62,63] , 它衡量的是标准答案在预测列表中排在前 n 个
缺陷令牌出现在预测结果Top-n个中的缺陷数
的普遍程度, 其计算方式为: recall@Top-n = . n 越小代表定位效果
缺陷总数
越精确, recall@Top-n 值越大代表缺陷定位的效果越好. 在我们的实验中, 我们选取 n 的值为 1, 3, 5, 10, 20. 在我们
的评估数据集中, 一个缺陷可能拥有多个缺陷代码令牌 (例如, 一个补丁更改了两个或者多个代码令牌的情况). 依
据基于谱的缺陷定位技术中的处理方式 [1] , 我们认为只要其中任意一个缺陷代码令牌的排名位于 Top-n 内, 这个
缺陷即被成功定位于 Top-n 内.
Mean first rank (MFR) 用于计算预测出的可疑代码元素排名列表中第一个缺陷代码元素的平均排名值 [1] , 其
m ∑
Rank(i)
计算方式为: MFR = i=1 , 其中, m 表示缺陷总数, Rank(i) 表示第 i 个缺陷中缺陷令牌在预测结果中的最高
m
排名. MFR 的值越低, 表明缺陷定位的精度越高.
4.4 实验设置
在本节中我们介绍实验设置的 3 方面: 一是我们的方法是如何实现并微调的, 二是我们是如何实现基准方法
与我们的方法进行比较的, 三是我们评估实验的设计.