Page 134 - 《软件学报》2025年第4期
P. 134
1540 软件学报 2025 年第 36 卷第 4 期
3 定位效果分析
3.1 不同粒度定位效果
传统基于检索的缺陷定位研究中将需要定位的缺陷位置设置成了不同的粒度, 包括文件级别、方法级别、行
级别等. 使用深度学习技术后同样是在这些粒度上定位缺陷位置. 因此, 首先从不同粒度定位效果的角度对比传统
的基于信息检索的缺陷定位方法和使用深度学习的基于信息检索的缺陷定位方法, 以回答 RQ2. 具体而言, 对调
研的 52 篇论文进行统计, 分析使用深度学习的基于信息检索的缺陷定位方法是否在各个定位粒度都有提升. 由于
第一代和第二代缺陷定位检索性能相似 [5] , 我们仅用对比使用深度学习的基于信息检索的缺陷定位方法于最先进
的传统基于信息检索的缺陷定位方法进行对比. 首先是文件级别, 缺陷定位中最常见的粒度使用深度学习的基于
信息检索的缺陷定位的大多数方法都是聚焦于定位到可能含有缺陷的文件.
最先将深度神经网络与改进的向量空间模型 (revised vector space model, rVSM) 这一信息检索技术结合起来
的缺陷定位方法是 Lam 等人 [14] 提出的 HyLoc. HyLoc 使用深度神经网络 DNN 来学习每个文件与缺陷报告的关
联性. HyLoc 的特征提取层由两个 DNN 组成, 第 1 个 DNN 学习缺陷报告中的文本特征与源代码特征的相关性,
成对缺陷方法的定位. 语义匹配网络经过双向的循环神经网络
称为 Bug Report-to-Code DNN. 第 2 个 DNN 学习缺陷报告中的文本特征与源代码中 API 描述里和评论的文本特
征的相关性, 称为 Bug Report-to-Text DNN. Sangle 等人 [46] 提出的 DRAST 先使用 srcML 将源文件标记并生成体
积较小的高级抽象语法树 (AST). 随后 DRAST 计算了 6 个信息检索相关的特征: 文本相似分数、协作过滤分数、
特征名称相似性分数、缺陷修复频率、最新缺陷修复时间分数和深度神经网络相关性分数, 其中前 3 个特征考虑
了源代码和缺陷报告之间的文本相似性, 第 4、5 个特征则通过应用信息检索技术考虑了缺陷报告的历史. 第 6 个
特征侧重于源代码和缺陷报告之间的词汇不匹配问题, 随后使用深度神经网络计算缺陷报告和源代码之间的相关
度得分. 最后通过随机森林回归器和 DNN 回归器完成对缺陷文件的定位. Zhu 等人 [47] 提出的 DEMOB 使用 AttL
和 MDCL 两个编码器分别学习源文件和缺陷报告的特征. 针对源文件的编码器 MDCL 通过多个 DCNN 提取标签
级别, 方法级别, 语句级别的源代码, 以方法级别输入双向 LSTM, 使得 MDCL 可以处理超长源文件. 针对缺陷报
告的编码器 AttL 通过带注意力机制的双向长短期记忆网络 (LSTM) 去除噪音. 最后将 MDCL 和 AttL 学习到的特
征结合, 定位到可能含有缺陷的代码文件. 在缺陷定位的效果上优于最先进的传统基于信息检索的缺陷定位方法
[7]
BugLocator .
文件级别的定位粒度较大, 根据一项关于理想的缺陷定位方法的调查 [76] , 只有 26.42% 的程序员对定位有缺
陷的文件表示满意, 而 51.81% 的程序员倾向于定位到有缺陷的方法. 随着定位粒度的细化, 方法级别的缺陷定位
会对缺陷定位技术提出了进一步的挑战, 比如当需要定位方法级别的代码模块时, 候选代码模块很多, 检索数量极
大增加. 此外, 还存在代码方法大小不一致, 长短不均匀的问题, 若用相同的方法处理极短与极长的方法, 会导致定
位能力的下降.
在当时被认为最先进的传统的基于信息检索的方法级别缺陷定位方法 BLIA1.5 [77] 的基础上, Cao 等人 [17] 提出
了一种方法级别的基于信息检索的缺陷定位方法 BugPecker, 依据缺陷修复记录中提取的信息构建修订分析图缓
解信息不足的问题同时匹配语义内容并扩展短方法的细节, 并通过语义学习器计算语义相似度, 再通过学习器结
合学习到的特征得到对应的含有缺陷的方法级别的源代码排名. Yang 等人 [48] 提出的 MRAM 通过 3 个网络来完
(RNN) 和注意力机制学习方法和缺陷报告的语义
和结构信息, 方法扩展网络补充长度过短的程序方法, 最后通过缺陷定位网络结合特征完成对缺陷方法的定位. 在
方法级别的缺陷定位效果上, BugPecker 和 MRAM 的 MAP, MRR 和 Top-N 均远优于前两代方法级别的基于信息
检索的缺陷定位方法.
代码变更不仅直接与源文件相关联, 也便于定位缺陷位置, 造成原因, 定位到有关的代码变更也可以快速地对
出错的代码进行修正. Ciborowska 等人 [52] 提出的 FBL-BERT 在离线阶段先通过 k-means 算法将代码变更集分成
多个类以缓解变更数据量过大的问题. 在缺陷定位时对于输入的缺陷报告先通过 Faiss 索引将缺陷报告匹配到一
类代码变更集, 将数量过多的代码变更集减少, 只选取与缺陷报告匹配的某一个变更集的类送入模型 FBL-BERT