Page 215 - 《软件学报》2020年第9期
P. 215
2836 Journal of Software 软件学报 Vol.31, No.9, September 2020
(comment)来强化定位方法.
3.2.3 堆栈踪迹
堆栈踪迹是缺陷产生时代码执行的异常信息.这些信息是高度结构化的,其中包含了异常的类型(例如空指
针异常和地址超界等)和出错代码所执行的路径信息(例如代码行、类名、方法名).因为缺陷所在的位置很可能
在于这个出错路径上,所以堆栈信息对于开发人员手动进行缺陷定位是十分重要的.而在研究定位工具时,也可
以通过提取堆栈中的信息(例如出错的类名)进一步强化工具的定位准确度.
堆栈踪迹特征的应用示例过程如图 6 所示.
Fig.6 Application sample of features: Stack trace
图 6 特征应用示例:堆栈踪迹
2014 年,Moreno 等人 [25] 考虑将堆栈踪迹信息应用到他们的方法 Lobster 中.他们使用缺陷报告中的堆栈踪
迹和软件源码中的程序依赖图来寻找在结构上相似的代码元素.具体说:对于给定的堆栈踪迹和代码元素,他们
之间的结构相似性被定义为堆栈踪迹中元素和代码中元素的最小距离.同年,Wong 等人 [30] 使用正则表达式从
缺陷报告的堆栈中提取所有的文件名以及对应的方法.在得到一组可疑的文件集合后,将上述文件对应方法中
直接使用到的类所对应的文件也加入到可疑文件集合,最后通过提高对这些文件在结果中的排名来改善定位
结果.2017 年,Youm 等人 [74] 在他们的方法 BLIA 中集成了 Wong 等人对堆栈踪迹的处理方法.
2016 年,Wang 等人 [80] 在他们的改良方法 AmaLgam+使用了堆栈踪迹特征.他们提出一个直观假设:若某个
类的引用距离堆栈顶部越近(出错位置),那么这个引用所在的文件越可能包含该缺陷.因此,他们设计了一个堆
栈分数来度量堆栈中出现的每个文件的可疑程度.对每缺陷报告中的堆栈,他们首先按序提取出所有文件名并
进行去重处理,然后使用每个文件排名的倒数作为该文件与缺陷报告在堆栈上的可疑程度.
2018 年,Rahman 等人 [35] 利用堆栈踪迹来重新查询.他们从堆栈踪迹中提取代码实体(类名和方法名).根据
执行顺序构造出权重图,并在图上面应用 PageRank 算法计算出每个代码实体的权重来重新构造查询语句.
3.2.4 代码结构
项目中的源代码是一种结构化文本,它的内容是由各种不同的代码实体(例如类名、方法名等)组成.直接将
它们看作自然语言文本处理会丢失其中的结构化信息,会导致定位结果准确率低下.合理利用这些结构特征,可
以帮助进一步提升自动工具的准确性.代码结构特征的应用示例过程如图 7 所示.
2013 年,Saha 等人 [24] 在设计模型时首先考虑到代码结构特征.对于代码库来说,他们使用 Eclipse JDT 解析
源代码的 AST 树,并提取其中的 4 种代码实体(类名、方法名、变量名和注释)信息;对于缺陷报告,他们分别使
用标题和描述构建两种查询.上述代码实体和查询共有 8 种不同的组合方式,他们分别计算每种组合的分数,然
后将所有组合的分数相加作为某个源文件的最终分数.最后,他们依据该分数向开发者推荐有缺陷的文件.
2016 年,Kilinc 等人 [90] 提出了 BugCatcher 方法,该方法首先使用基础的检索方法对源代码进行检索获得一
个排序结果;然后,从代码中提取类名、方法名和注释分别建立索引,并且根据这 3 类信息对首次结果进行重排;
最后使用一种用到重新索引的缩小范围技术计算最终结果.同年,Wen 等人 [32] 提出了 Locus 方法.该方法对自然
语言和代码实体分别构建语料库和查询语句,将两个查询结果组合起来输出变更块(change hunk)的排序,并在
此基础上选出可以的文件或者变更.
2018 年,Dilshener 等人 [79] 提出一种不需要历史信息,仅使用结构和堆栈信息的缺陷定位方法.同年,Swe 等