Page 271 - 《软件学报》2024年第4期
P. 271
王尚文 等: 基于指针神经网络的细粒度缺陷定位 1849
• 方法实现与微调. 我们的模型是在 PyTorch 版本的指针网络 (https://github.com/shirgur/PointerNet) 以及
code2seq 技术的代码框架 (https://github.com/tech-srl/code2seq) 上实现的. 代码已发布在 http://doi.org/10.5281/
zenodo.4717352. 模型的训练在两台拥有 1080Ti GPU 配置的服务器上进行. 作为神经网络的模型, 我们对方法在
应用前进行了微调. 在微调过程中, 我们从 CoCoNut 数据集中随机选取 43 000 个补丁用作验证集, 其余补丁则用
于训练与测试. 我们关注于以下几个模型的超参数: 用于表征子令牌的向量长度 (64, 128, 256); 学习率 (0.001,
0.002, 0.005); 训练轮数 (20, 40, 50); 批量大小 (64, 128, 256); 抽象语法树路径最大长度 (10, 15, 20); 以及输入模型
的操作路径最大数量 (100, 120, 150, 180, 200). 我们将列出的超参数值进行组合并实验了每种组合的效果, 以在验
证集上损失值最小的数值组合作为最佳的超参数配置, 模型最终的超参数值在表 1 中列出.
表 1 模型超参数取值
子令牌向量长度 学习率 训练轮数 批量大小 路径最大长度 路径最大数量
128 0.001 40 256 15 120
• 基准方法设计. 我们的方法是第一个关注于代码令牌级别缺陷定位的, 因此没有现有的方法与之进行比较.
我们提出了两个基准方法与我们的方法进行比较.
第 1 个基准是基于统计的方法. 在 Liu 等人 [64] 关于真实程序中补丁的分析中, 他们发现一些特定的代码元素
相较于其他代码元素更倾向于存在缺陷. 我们提出利用这一研究公布出的不同类别的代码令牌出现缺陷的频率建
立一个简单的基准方法, 即依据代码令牌出现缺陷的频率由高到低对令牌进行排序. 对于相同类型的代码令牌, 它
们的顺序由它们在缺陷方法的代码令牌流中出现的顺序决定.
第 2 个基准是基于机器学习的方法. 对于缺陷方法中的代码令牌, 我们提取 4 种特征, 即该令牌在令牌流中的
排序、该令牌所在语句的类型 (例如, 返回语句或条件语句)、该令牌所包含的字符数以及该令牌所包含的子令牌
数. 我们假设缺陷令牌与正常令牌可能在这些特征上存在区别, 因此我们训练了随机森林模型 [65] 并依据这些特征
预测缺陷令牌.
• 评估实验. 为了回答本文提出的研究问题, 我们不仅将 CoCoNut 数据集上训练好的模型在 ManySStuBs4J
和 Defects4J 数据集上进行测评, 同时也在 CoCoNut 数据集上进行了十折交叉验证, 这是因为 CoCoNut 数据集包
含了远多于其他两个数据集的补丁, 在该数据集上进行实验评估有助于衡量我们方法的普适性. 我们模型的微调
过程已在前文中介绍, 而基准方法中随机森林模型的超参数则复用于机器学习开源库 sklearn (https://scikit-learn.
org/stable/). 我们的实验是在内存为 64 GB、GPU 为 1660 Ti 的服务器上进行的. 在 CoCoNut 数据集上训练一个
epoch 的用时约为 8 min, 因此, 十折交叉验证中的每一折大约花费 5 h.
我们的实验考虑了两种场景: 提供给每种方法整个缺陷方法以及在缺陷方法的基础上定位到了具体的缺陷语
句. 这两种条件都能被当前基于程序谱的缺陷定位方法所提供. 在进行第 2 个场景的实验时, 我们忽视缺陷方法中
在缺陷语句之外的代码令牌的可疑值, 仅对缺陷语句中包含的代码令牌进行排序.
• 标准答案的获取. 针对每一个缺陷程序, 我们使用 GumTree 抽象语法树差分技术来计算缺陷程序与正确补
丁之间在抽象语法树层面的代码变更差异. 通过得到的差异, 我们可以识别到抽象语法树路径 (即从根节点到被修
改的叶子节点的路径) 以及操作路径 (即抽象语法树路径、该叶子节点对应的代码令牌和代码变换操作). 通过抽
象语法树差分得到的操作路径即被视为标准答案, 也即需要被预测出来的路径, 这些路径中对应的代码令牌即为
需要预测的缺陷代码令牌.
4.5 实验结果与分析
4.5.1 RQ1: BEEP 能否有效识别真实程序中的缺陷代码令牌?
为了验证这个问题的结果, 我们将 BEEP 方法与两种基准方法在不同粒度的输入下 (即输入为缺陷语句与输
入为缺陷方法) 进行了对比实验, 在解析 BEEP 返回的结果时, 我们仅关注操作路径中的代码令牌信息 (即忽略操
作路径中的代码变换操作信息, 如果一条操作路径中的代码令牌与实际缺陷令牌一致即被视为是正确的预测). 实
验的结果见表 2 与表 3.