APP下载

基于缺陷报告分析的软件缺陷定位方法

2019-10-08高子欣赵逢禹刘亚

软件 2019年5期

高子欣 赵逢禹 刘亚

摘  要: 在软件开发过程中,软件缺陷是不可避免的。在缺陷跟踪系统中,一个重要的问题是如何根据用户所提交的缺陷报告,进行缺陷的自动定位。本文在综合考虑缺陷报告与源代码文件结构相似性的基础上,进一步分析已修复缺陷报告、缺陷报告中的异常堆栈(Stack Trace)信息对软件缺陷定位的作用,从而提高定位的精度。在Eclipse、AspectJ和SWT开源项目数据程序集上进行相关实验,并与Buglocator、BRTracer和BLUiR缺陷定位方法进行了比较分析,实验结果表明,本文方法能显著提高软件缺陷定位的精度。

关键词: 缺陷定位;缺陷报告;结构相似;异常堆栈信息

中图分类号: TP311.5    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2019.05.002

本文著录格式:高子欣,赵逢禹,刘亚,等. 基于缺陷报告分析的软件缺陷定位方法[J]. 软件,2019,40(5):0815

【Abstract】: Software defects are inevitable during the software development process. In the defect tracking system, an important issue is how to automatically locate defects based on the bug report submitted by the user. Based on the comprehensive consideration of the structural similarity between the defect report and the source code file, this paper further analyzes the effect of the abnormal stack information in the fixed defect report and defect report on the software defect location, thus improving the positioning accuracy. Related experiments are carried out on the Eclipse, AspectJ and SWT open source project data assemblies, and compared with Buglocator, BRTracer and BLUiR defect location methods. The experimental results show that the proposed method can significantly improve the accuracy of software defect location.

【Key words】: Bug localization; Bug report; Similar structure; Stack information

0  引言

在整个软件的生命周期中,软件维护约占整个软件开发项目工作量的40%左右[1-3]。在进行软件维护时,如何定位软件缺陷,是极具挑战性的。当用户在使用软件过程中发现问题时,通常向软件缺陷跟踪系统中提交缺陷报告,开发人员再根据用户填写的缺陷报告进行缺陷定位,修改相应的代码。但是随着软件规模以及复杂度的不断加大,缺陷也越来越多,缺陷跟踪系统上每天会收到大量的缺陷报告,只是通过人工完成缺陷定位会严重影响工作效率,所以如何通过缺陷报告自动定位到有缺陷的代码一直是研究人员关注的热点问题。

基于缺陷报告进行软件缺陷定位目前已经有许多研究成果。Zhou等人[4]提出了BugLocator方法,原理是基于信息检索,优化向量空间模型,根据源代码文件和缺陷报告之间的文本相似度并结合历史缺陷报告进行缺陷定位。Wong等人[5]提出了BRTracer方法,通过使用代码分段和Stack Trace信息分析来提高缺陷定位的性能。他们将每个源代码文件分成一系列的代码片段,对于给定的一个缺陷报告,他们使用与该缺陷报告最相似的代码片段来表示该源代码文件,并利用了缺陷报告中的Stack Trace信息与源代码文件之间的相似性。Saha等人[6]提出了BLUiR方法,通过修改tf-idf的计算方式,并利用源代码结构化信息来检索计算与缺陷报告中Summary和Description中的内容相似度,从而进行缺陷定位。

表1为从Eclipse官网中提取的一条Bug ID为80720缺陷报告以及这条缺陷对应的源代码文件,这条缺陷报告主要是根据Description内容进行缺陷定位。

目前大部分研究人员都是将软件缺陷报告和源代码文件当作普通的文本来处理,分析它们之间的相似度,该方法主要是通过使用文本信息检索技术[7-8]来比较缺陷报告与源代码文件的相似性,对缺陷所在的源代码文件进行定位。而实际上,软件缺陷报告中通常包含Stack Trace信息、函数间调用的关系等,如果直接将它们视为纯文本,则会丢掉大量有价值的缺陷信息,也会导致缺陷定位不准。

表2为另一条Bug ID为43709的缺陷报告以及这条缺陷对应的源代码,这条缺陷报告则是根据Stack trace内容进行缺陷定位。Schroter等人[9]的一项研究表明,缺陷可能存在Stack Trace中的前10个函数中。

本文在综合考虑软件缺陷报告与源代码文件结构相似性的基础上,进一步分析待修复缺陷报告与已修复缺陷报告相似性、缺陷報告中的Stack Trace信息与源代码文件相似性,从而提高定位的精度。

本文其它部分内容的组织说明如下:第二部分介绍了基于缺陷报告分析的软件缺陷定位框架;第三部分详细分析了本文用到的关键技术与方法;第四部分为实证分析该方法并与其他经典方法进行对比,确保其可行性;第五部分对本文方法做出总结并提出下一步改进工作。

1  基于缺陷报告分析的软件缺陷定位框架

图1为基于缺陷报告分析的软件缺陷定位框架(Bug Report Defect location, 简记为BRDL)。首先提取并预处理源代码文件中的Class、Method、Variable、Comments等信息,并存储为源代码XML结构化文档。同理我们将缺陷报告的Summary、Description、Comment提取出来并进行预处理操作,计算缺陷报告与源代码文件的结构相似度;由于缺陷往往是存在于源代码文件中的某个方法或者代码块中,所以再计算源代码中的方法与缺陷报告的相似度,提高单个方法的影响力度;由于经常被修改的源代码文件,含缺陷概率越高,待修复缺陷报告与已修复缺陷报告的相似度越高,则待修复缺陷报告关联的缺陷文件很可能就是已修复缺陷报告修复的源代码文件,用它们的相似度分数来调整最终源代码文件排序;由于一些缺陷报告中会存在Stack Trace等信息,这些信息记录了错误路径上调用的方法以及所涉及到的类,它们参与了程序的错误执行过程,与程序错误密切相关,所以要对缺陷报告中的Stack Trace信息进行分析以辅助缺陷定位。

(1)构建源代码XML结构化文档

对源代码使用Eclipse中的JDT技术来构建抽象语法树[10-11],通过抽象语法树来提取程序结构:Class、Method、Variable、Comments,并对Comments的内容进行去除停用词等预处理,最后将这些处理后的信息存储为一个源代码XML结构化文档。

(2)计算缺陷报告与源代码文件的文本结构相似度

提取缺陷报告中的Summary、Description、Com?ments等相关信息,并进行分词、去除停用词等预处理操作,计算其与源代码XML结构化文档以及源代码中方法的相似度。

(3)计算已修复缺陷报告与待修复缺陷报告的相似度

由于同一问题可能被不同用户多次提交,并且经常被修改的源代码文件含缺陷的概率更高,若一个待修复缺陷报告与已修复缺陷报告的相似度越高,则已修复缺陷报告所关联的缺陷文件很可能就是这个待修复缺陷报告需要定位的源代码文件。

(4)分析缺陷报告中的Stack Trace信息并计算其与源代码文件的相似度

由于缺陷报告中的Stack Trace信息记录了错误路径上的调用的方法以及所涉及到的类,它们参与了程序的错误执行过程,所以该信息与程序错误密切相关,这里我们根据程序依赖图找到源代码中相关元素与Stack Trace中的结构化元素间的最小路径,并计算其相似度。

2  基于缺陷报告分析的软件缺陷定位的关键技术与方法

基于缺陷报告分析的软件缺陷定位框架如图1所示,其关键方法主要包含文本预处理、源代码结构信息与缺陷报告相似度计算、待修复缺陷报告与已修复缺陷报告相似度计算和源代码的结构信息与缺陷报告中的Stack Trace信息相似度计算。

2.1  文本预处理

预处理的目的是将缺陷报告或源代码文件文本分解成可以被信息检索技术分析的词,即统一了词空间。在对源代码文件进行处理时,我们先将其转换成抽象语法树(Abstract Syntax Tree),则Class、Method、Variable、Comments等文本信息可被直接提取出来;提取缺陷報告中的Summary、Descri?ption、Comment内容;对提取的缺陷报告的内容以及源代码文件中的Comments的内容进行分词、去除停用词、提取词干等预处理操作。

在进行标识符分割时,那些标志符通常是根据Camel Case splitting[12]分割原则分割成它的构成词,但这样会增加单个词命名的权重。所以我们将所有非字母符号转为空格,用空格将文本分割成一连串的词。

由于缺陷报告和源代码文件有不同的停止词。对缺陷报告而言,“is”、“the”、“on”等都是英文停止词。对源代码文件而言,除了英文停止词,还要移除关键字,如“private”、“public”、“return”等。所以我们定义了两个去停用词列表,一个是英文停用词,还有一个就是关键字。选择去英文停用词对自然语言文本进行去停用词操作;选择去关键字对源代码进行去停用词操作。

最后,使用标准的Porter Stemmer[11]来执行词干提取,将衍生词还原为词根形式。例如,词“removing”和“removes”将还原成词“remove”。经过此处理后,相似的词就能以相同形式出现。

2.2  源代码结构信息与缺陷报告相似度计算

缺陷报告与源代码文件进行预处理之后,我们计算源代码的结构信息:Class、Method、Variable、Comments与缺陷报告的相似度,将源代码XML文档中的Class、Method、Variable、Comments中的内容分别与预处理后的缺陷报告内容进行词语匹配,如表3所示。

由于缺陷通常是存在于源代码文件中的某个方法或某个代码块中,所以这里增加方法的权重,单独计算源代码的方法中的信息与缺陷报告的匹配程度,以提高单个方法的影响力度。表4为源代码方法信息与缺陷报告词语匹配。

3  实验分析

为了验证本文方法的实用性,选取了被其他研究人员经常使用的数据集Eclipse3.1,AspectJ1.5,SWT3.1进行实验分析,并与Buglocator、BRTracer、BLUiR三个缺陷定位方法进行比较,从而验证本方法对提高软件缺陷定位的精确度可行性。