融合代码静态特征和频谱的软件缺陷定位技术
2023-10-18王浩仁岳雷李静雯崔展齐
王浩仁 岳雷 李静雯 崔展齐
摘 要:基于頻谱的缺陷定位(spectrum-based fault localization,SBFL)通过分析测试用例的覆盖信息和执行结果信息进行快速定位,是目前最常用的缺陷定位技术。然而,该方法未能充分利用代码中隐含的语义和结构信息。若能将缺陷预测中使用到的代码结构信息和频谱信息融合使用,将有助于进一步提升缺陷定位的效果。为此,提出了一种融合代码静态特征和频谱的软件缺陷定位(fault localization combing static features and spectrums,FLFS)技术。首先,从Halstead等度量元集合中选取度量元指标并进行修改,以适用于度量代码的方法级特征;然后,根据选取的度量元指标提取程序中各个方法的静态特征并用于训练缺陷预测模型;最后,使用缺陷预测模型预测程序中各方法存在缺陷的预测可疑度,并与SBFL技术计算的频谱可疑度进行融合,以定位缺陷所在方法。为验证FLFS的有效性,将其与两种定位效果最好的SBFL技术DStar和Ochiai在Defects4J数据集上进行了对比实验。结果表明,FLFS具有更好的缺陷定位性能,对于Einspect@n指标,当n=1时,FLFS相比DStar和Ochiai分别多定位到16和10个缺陷;对于MRR指标,FLFS相比DStar和Ochiai分别提升了4.13%和1.08%。
关键词:缺陷定位;缺陷预测;程序频谱;代码结构信息;可疑度
中图分类号:TP311.5 文献标志码:A
文章编号:1001-3695(2023)09-035-2785-07
doi:10.19734/j.issn.1001-3695.2023.02.0054
Fault localization combing static features and spectrums
Wang Haoren,Yue Lei,Li Jingwen,Cui Zhanqi
(School of Computer Science,Beijing Information Science & Technology University,Beijing 100101,China)
Abstract:SBFL is the most commonly used fault localization technique,which performs fast localization by analyzing the coverage and execution result information of test cases.However,SBFL fails to fully utilize the implicit semantic and structural information of the code.If the code structure information used in fault prediction and the spectrum information can be fused,it will further improve the effectiveness of fault localization.To this end,this paper proposed a software FLFS method.Firstly,it selected feature from the metrics,including Halstead,CK,etc,and adapted them to measure the method-level features of the code.Then,it extracted the static features of each method in the program according to the metrics and used them to train the fault prediction model.Finally,it used the fault prediction model to predict the prediction suspiciousness of each method in the program and fused it with the spectrum suspiciousness calculated by SBFL to locate the faulty method.To verify the effectiveness of FLFS,this paper compared it with two most effective SBFL techniques,DStar and Ochiai,on the Defects4J dataset.The results show that FLFS outperforms SBFL in terms of Einspect@n,and MRR.For Einspect@n,when n=1,FLFS locates 16 and 10 more faults than DStar and Ochiai respectively.For MRR,FLFS improves by 4.13% and 1.08% compared to DStar and Ochiai respectively.
Key words:fault localization;fault prediction;program spectrum;code structure information;suspiciousness
0 引言
软件缺陷定位通过定位程序中的缺陷所在位置为调试提供关键信息,从而提高软件调试和修复的效率,是一种重要的软件质量保障技术。基于频谱的缺陷定位(SBFL)是目前应用为最为广泛的缺陷定位技术[1],该类技术通过分析测试用例的覆盖信息和执行结果信息计算出每个程序元素的可疑度值,可疑度值的大小与程序元素包含缺陷的可能性相关[1,2]。开发人员可以根据元素的可疑度值排名进行检查,达到快速定位、提高缺陷定位效率的目的。SBFL技术常被应用于定位缺陷语句,然而程序员在确认缺陷位置时仍然需要结合缺陷语句的上下文及代码结构才能修复缺陷。因此,与语句级缺陷定位相比,方法级的缺陷定位更有利于程序员理解和修复代码,且方法级缺陷定位相比语句级缺陷定位具有更高的精度[3]。然而,DStar[4]作为定位效果最好的SBFL技术之一,其定位精度仍然有待提高,例如在对Defects4J[5]数据集进行缺陷定位时,检查可疑度排名第一的方法也仅能定位到30.6%的缺陷。
而定位精度有限的原因之一是缺陷定位过程中通常仅使用了测试用例的覆盖信息和执行结果,未能充分利用代码中隐含的语义和结构信息。现有一些工作尝试将更多的信息与程序频谱进行结合,以提升软件缺陷定位的性能。例如,姜淑娟等人[6]提出了一种基于路径分析和信息熵的缺陷定位方法,通过对程序中所有执行路径的数据依赖关系进行分析得到程序执行路径的上下文信息,并利用信息熵理论将测试事件信息引入可疑度公式来提高缺陷定位的性能。Wen等人[7]提出了一种基于历史谱的缺陷定位技术,该技术先从版本历史记录中识别导致缺陷的提交,用于构建历史谱,并通过结合历史谱和常规频谱进行缺陷语句定位。Saha等人[8]考虑到代码结构特征,利用代码类名、方法名、注释等信息与缺陷报告组合,通过分别计算每个组合的文本相似度得分将所有组合得分加权求和作为文件的最终得分进行缺陷定位。因此,若能够合理利用代码中隐含的语义和结构信息将有助于提升缺陷定位性能。
软件缺陷预测根据代码的语义和结构信息,借助随机森林[9]、深度神经网络[10]等机器学习方法对程序代码中存在缺陷的倾向性和数量等进行预测。缺陷预测重点关注程序内部模块级的缺陷情况,因此当其被用来预测更细粒度的方法级代码时,预测精度往往会大幅降低,难以准确定位缺陷位置。例如,方法级缺陷预测技术IVDetect[11]在实际应用中的F1值均低于0.3,precision值也均低于0.25。若能将缺陷预测中使用到的代码结构信息和SBFL的频谱信息融合使用,将有助于提升缺陷定位的效果。在真实的应用场景中,包含缺陷的方法数量在方法总数中占比极少,存在严重的类不平衡问题,若直接用于训练缺陷预测模型,将对缺陷预测模型的性能造成严重威胁。例如,在Defects4J的395个程序中,包含缺陷的方法只占所有方法的很小部分。如表1所示,TT(total test cases)和FT(failing test cases)列出了Defects4J各项目中所有方法的数量和包含缺陷的方法数量;FT/TT列表示缺陷方法数与所有方法数的比率;FT/TT列的值表明各项目中含有缺陷的方法仅占全部方法的0.05%~1.19%。严重的类不平衡问题将会降低缺陷预测模型的质量,影响软件缺陷预测的性能。
为此,本文提出了一种融合代码静态特征和频谱的软件缺陷定位技术,称做FLFS。首先,从Halstead、CK等度量元集合中选取度量元指标并进行修改,以适用于度量程序的方法级特征;然后根据度量元指标提取程序中各个方法的静态特征,对方法静态特征数据集中不存在缺陷的方法进行聚类,从不同类簇中选取代表性的方法,用于训练缺陷预测模型以缓解类不平衡问题;最后,使用缺陷预测模型预测程序中各方法存在缺陷的预测可疑度,并与SBFL技术计算各方法的频谱可疑度进行融合以定位缺陷所在方法。基于Defects4J数据集,将FLFS与现有缺陷定位效果最好的SBFL技术DStar和Ochiai[12]进行对比实验。结果表明,对于Einspect@n指标,当n=1时,FLFS相比DStar和Ochiai分别多定位到16和10个缺陷;对于MRR指标,FLFS相比DStar和Ochiai分別提升了4.13%和1.08%。
本文提出一种融合代码静态特征和频谱信息的软件缺陷定位技术,提取代码结构特征训练缺陷预测模型,并将基于模型预测的各方法中存在缺陷的预测可疑度与基于频谱计算的频谱可疑度融合,以进行方法级的缺陷定位。
1 相关工作
1.1 基于频谱的缺陷定位
国内外研究人员针对软件缺陷定位进行了大量研究,常用技术包括基于频谱的缺陷定位技术[1]、基于信息检索的缺陷定位技术[13]等,本文重点关注基于频谱的缺陷定位技术。
研究人员已经提出了很多基于频谱的缺陷定位技术,其中,Jone等人[14]最先提出Tarantula,使用覆盖率和测试用例执行结果来度量语句的可疑度值。随后,通过改进可疑度公式,研究者相继提出了一些效果更佳的SBFL技术。Abreu等人[12]受聚类分析中相似度系数的启发提出了Ochiai,提高了软件缺陷定位性能;Wong等人[4]通过进一步分析测试用例在程序实体上成功执行的数量对缺陷定位结果的影响,得出了被成功测试用例覆盖次数越多的程序实体其覆盖次数对可疑值的贡献度越小这一结论。随后为了突出在成功用例数量较多时失败用例对定位结果的影响,又提出了DStar,并且通过实验对比发现DStar的缺陷定位效果优于其他同类缺陷定位技术。此外,Xie等人[15]提出了一种基于蜕变切片(metamorphic slice,MS)SBFL技术,通过蜕变测试和程序切片生成MS,并使用蜕变关系(metamorphic relation)生成更多测试用例以用于缺陷定位,此方法的特点在于无须测试用例的测试预言(test oracle),并取得了与现有SBFL相近的性能。
除仅使用程序频谱信息进行缺陷定位外,还有研究尝试通过引入代码中隐含的其他信息来提升缺陷定位的性能。Saha等人[8]考虑到代码结构特征,将缺陷报告分为标题和描述两个部分,将代码分为类名、方法名、注释等,并与缺陷报告组合,通过分别计算每个组合的文本相似度得分,将所有组合得分加权相加作为文件的最终得分。因此,合理利用代码的结构信息可以提升缺陷定位的准确性。本文提出技术也将代码结构信息加入到缺陷定位中以提高定位效果。不同于上述SBFL仅使用语句覆盖信息进行缺陷定位,本文提出技术通过将缺陷预测中使用到的代码结构信息和SBFL的频谱信息融合,以缓解SBFL使用代码信息较少、定位精度有限的问题。
1.2 软件缺陷预测
静态软件缺陷预测可以将程序模块的缺陷倾向性、缺陷数量作为预测目标[16]。本文将重点关注软件缺陷预测中预测代码缺陷倾向性的技术。该技术首先分析软件程序代码,从中抽取出程序元素,并根据实际应用场景,元素的粒度可分别为文件、类或函数等;然后提取出程序元素的各类度量元特征,并将是否包含缺陷作为程序元素的标签,以构建缺陷预测数据集;最后,对缺陷预测数据集进行必要的数据预处理后使用分类和回归等机器学习方法构建缺陷预测模型。已有研究尝试使用不同机器学习方法构建缺陷预测模型的性能进行比较。例如,Elish等人[17]基于NASA数据集,将支持向量机与朴素贝叶斯、随机森林等其他八种机器学习方法构建的缺陷预测模型进行了系统比较,实验结果表明,SVM在总体评价上要优于其他八种方法构建的缺陷预测模型。
还有研究人员通过研究对缺陷预测模型性能的影响条件,以判断机器学习方法应用于缺陷预测时的性能差异。例如。Catal等人[18]基于NASA数据集,以AUC值为评价指标,深入分析了数据集规模、度量元和特征子集选择方法对缺陷预测模型性能的影响,结果表明随机森林法在大规模数据集上性能最优,而朴素贝叶斯则在小规模数据集上的性能最优。除此之外,已有研究提出了多种基于深度神经网络的方法来进行缺陷预测。例如,Russell等人[19]提出了一种基于RNN的架构来自动提取源代码的特征以进行缺陷预测;Dam等人[20]提出了一种基于LSTM的架构来自动学习源代码的语义和句法特征。
不同于上述缺陷预测技术主要在文件级或类级对代码中存在缺陷的倾向性进行预测。本文提出的FLFS通过将缺陷预测中使用到的代码结构信息和频谱信息融合,以更充分地利用代码结构信息取得更好的软件缺陷定位效果。
2 FLFS方法设计
现有基于频谱的缺陷定位技术中的突出问题之一是未充分利用代码结构信息,导致定位精度受限,人工检查和调试开销较高。为此,本文提出了一种融合代码静态特征和频谱的软件缺陷定位技术,其流程如图1所示。
2.1 方法级静态特征
分析软件历史仓库、设置与软件缺陷存在强相关性的度量元是构建高质量缺陷预测模型的关键。因此,度量元的设计一直是软件缺陷预测研究中的一个核心问题[16]。本文从现有的研究中选取适用的方法级度量元指标,这些度量元信息将用于训练方法级缺陷预测模型,进而为缺陷定位提供指导。缺陷预测领域经常使用的静态特征有Halstead度量元[21]、CK(Chidamber Kemerer)度量元[22]、Martin度量元[23]和McCabe圈复杂度(cyclomatic complexity)[24]等。其中,Halstead度量元主要通过统计程序内操作符和操作数的数量来度量代码的阅读难度,并假设代码的阅读难度越高,代码含有缺陷的可能性也越高;CK度量元和Martin度量元集合则是为面向对象程序设计的,通常代码中类的复杂度越高,存在缺陷的概率也越高;McCabe圈复杂度关注的是程序的控制流复杂度,该度量元假设程序的控制流复杂度越高,则其含有缺陷的可能性也越高。参考上述度量元集,通过去除Halstead、CK、Martin和McCabe度量元中部分不适用的度量元、合并具有相同含义的度量元,并将其中模块级、类级的度量元进行修改,以适用于方法级,构建了一套适用于度量方法级代码特征的度量指标集合,包括注释代码行数、代码行数、方法调用数量、圈复杂度等,如表2所示,共包含21种度量元。其中,从Halstead度量元中选择了12种,包括方法中分支的个数、操作符种类数等;从CK度量元中选择了4种,包括方法被其他方法调用次数、方法调用其他方法的次数等;从Martin度量元中选择了3种,如方法中参数的个数等;从McCabe度量元中选择了2种,为圈复杂度和代码行数。被选取的21种度量元中有14种是将原用于模块级或类级的度量元应用于方法级,另外7种则需要进行适当修改以适用于度量方法级特征。
各个度量元的具体含义为:a)n1,该度量元用来统计方法中的操作符种类数,操作符包括关键字、函数调用、运算符,该特征的具体数值为关键字、函数调用和运算符种类的和;b)N1,该度量元用来统计方法中的操作符种个数,具体数值为关键字、函数调用和运算符个数的和;c)n2,该度量元用来统计方法中的操作数的种类,操作数包括常数、常量、变量,其中变量的类型有整数型的byte、short、int、long,浮點类型的float和double等;d)N2,该度量元用来统计方法中的操作数的个数,具体为方法中常数、常量和变量个数的和;e)N,该度量元在Halstead度量元中表示程序长度,应用到方法级中为每个方法所有操作符和操作数的和,即N=N1+N2;f)n,该度量元表示每个方法中所有操作符种类和操作数种类的和,即n=n1+n2;g)BranchCount,该度量元用来统计方法中所有分支的个数;h)Volume,该度量元参考Halstead度量元中体积的计算公式Volume=N log2n,表示方法的规模;i)Difficulty,该度量元表示复杂度,使用公式Difficulty=(n1/2)×(N2/n2)计算方法的复杂度;j)Level,该度量元表示可理解程度,使用公式Level=(2/n1)×(n2/N2)计算方法的可理解程度;k)Effort,该度量元表示工作量,使用公式Effort=Volume×Difficulty计算方法的工作量;l)Time,该度量元表示开发方法所需耗费的时间,参考Halstead度量元,使用公式Time=Effort/18来计算;m)FunIn,该度量元表示方法被其他方法调用的次数;n)FunOut,该度量元表示方法调用其他方法的次数;o)CBO,该度量元表示方法之间的耦合关系,具体公式为CBO=FunIn+FunOut,即该方法被调用和调用其他方法次数的和;p)Length,该度量元表示方法名的长度;q)LongParameter,该度量元参考Martin度量元,表示过长参数列表,即一个方法需要传递太多的参数时更有可能包含缺陷,将其修改为方法的参数个数;r)SwitchCount,该度量元表示方法中switch语句的个数;s)Comments,该度量元记录方法中注释的行数,程序语言中通常有单行注释、多行注释和文档注释三种注释,本文将方法包含注释行数的和作为该度量元的值;t)CycComplexity,该度量元表示方法的圈复杂度,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,即所需测试的最少路径条数;u)LOC,该度量元表示方法中包含语句(非空行)的数量。
2.2 融合代码静态特征和频谱的软件缺陷定位技术
首先,使用所提取的代码静态特征(如行数、方法调用次数等)组成方法级静态特征数据集,并通过对方法级静态特征数据集中不包含缺陷的方法进行聚类,从不同类簇中选取代表性的方法,与包含缺陷的方法静态特征组合,以训练缺陷预测模型;然后使用SBFL计算方法中所有語句的可疑度值,将方法中所有语句可疑度的最大值作为方法的频谱可疑度,并与模型预测每个方法存在缺陷的预测可疑度进行融合,通过增加分析程序的静态特征信息以进一步提升SBFL的缺陷定位性能。在融合预测可疑度和频谱可疑度时,借鉴文献[25]中将词频和逆文本频率指数进行数值相乘得到词频—逆文件频率的方式,通过将预测可疑度与频谱可疑度相乘得到方法融合可疑度。
M(i)=spectrum(i)×prediction(i)(1)
其中:spectrum(i)表示第i个方法的频谱可疑度值;而prediction(i)表示模型对第i个方法预测的预测可疑度值,即该方法预测为缺陷的概率;M(i)表示第i个方法通过将预测可疑度与频谱可疑度相乘得到的融合可疑度值。
2.3 类不平衡问题处理
在分类学习任务中常会遇到类不平衡问题,即数据集中不同类样本的数据量差距较为悬殊[26],使用类不平衡的数据集训练所得的模型,往往对少数类数据的预测精度较低。对于类不平衡的数据集,可通过对负类样本进行过采样和对正类样本进行欠采样来改善数据分布,使数据集趋向类平衡。但需要注意的是随机过采样方法容易导致过度拟合问题,而随机欠采样方法常常会引起信息丢失。为了弥补随机欠采样过程中可能丢失有用信息样本的缺点,对方法静态特征数据集中的数据使用基于聚类的欠采样方法[27]进行处理。聚类是一种无监督学习方法,按照划分思想以簇内相似、簇间相异原则通过迭代将数据划分到不同的簇中,并使生成的簇尽可能地紧凑和独立。通常,聚类算法常被用于数据压缩和信息检索,可通过聚类达到降低数据维度来完成数据划分等目的[27]。
在构建方法静态特征数据集的过程中,发现数据集存在非常严重的类不平衡现象。在Defects4J的395个程序中,包含缺陷的方法只占所有方法的很小部分,各项目中含有缺陷的方法仅占全部方法的0.05%~1.19%,即包含缺陷的方法极少而不存在缺陷的正确的方法占绝大多数。为缓解此问题,将去除方法静态特征数据集中重复的方法,并对不存在缺陷的方法进行聚类,再通过从不同类簇中选取代表性方法以达到减少重复数据、缓解类不平衡问题的目的,经过处理后将得到类分布更平衡的数据集,并用于训练缺陷预测模型。
2.4 实例分析
本节使用Defects4J中Chart项目的第14个版本作为示例,以介绍FLFS的实际使用过程。a)通过使用DStar计算程序中的所有方法的频谱可疑度,表3中,Spectrum表示方法的频谱可疑度值,Spectrum-Rank表示方法的频谱可疑度排名,可以看出含有缺陷的方法removeRangeMarker按照频谱可疑度值被排为第四;b)使用缺陷预测模型预测程序中各方法的预测可疑度,表3中Prediction列表示缺陷预测模型预测方法为缺陷的预测可疑度值;c)使用式(1)将SBFL技术计算的各方法的频谱可疑度与预测可疑度进行融合以定位缺陷所在方法。定位结果如表3所示,其中,FLFS列表示方法的融合可疑度值,FLFS-Rank表示方法的融合可疑度值排名;Faulty表示该方法是否存在缺陷,1为含有缺陷的方法,0为无缺陷方法。可以看出,通过FLFS进行缺陷定位,能够将包含缺陷的方法removeRangeMarker排到第一。
由上述示例可以看出,SBFL仅使用频谱信息计算可疑度,将覆盖更多错误测试用例的方法赋以更高的频谱可疑度,但未能充分利用代码中隐含的语义和结构信息,导致缺陷方法的可疑度值低,定位效果较差。而在SBFL中加入缺陷预测的结果后,通过增加静态特征信息,如方法的圈复杂度、参数个数等信息来提高缺陷定位的效果。含有缺陷的方法removeRangeMarker因其规模、圈复杂度等特征相比其他方法更高,将得到较高的预测可疑度值,进而导致融合可疑度值排名更高,所以比SBFL的定位效果更好。
3 实验与结果
为了检验FLFS的有效性,将在Defects4J(V1.4.0)数据集上进行实验。在实现FLFS过程中,使用了第三方机器学习库Scikit-learn(https://scikit-learn.org/stable/)中的K-means算法和RF模型对方法静态特征数据集进行聚类和缺陷预测。具体来讲,首先汇总数据集中不包含缺陷方法的静态特征信息,使用K-means算法对这些方法的静态特征信息进行聚类,其中,在聚类算法中设置的类簇数量为当前训练数据集中正样本的数量,以保持包含缺陷的方法和不包含缺陷的方法数量相同,而最大迭代次数等其他参数则保持默认参数;然后,从聚类的不同类簇中各随机选取一条方法的静态特征数据作为代表性数据,与包含缺陷的正样本数据组合为训练集,以缓解类不平衡问题;基于RF训练缺陷预测模型,以预测程序中各方法存在缺陷的预测可疑度,并与SBFL技术计算出的各方法的频谱可疑度进行融合。由于缺陷预测模型的直接输出仅为方法是否包含缺陷,为了更充分地利用缺陷预测模型的结果,使用Scikit-learn中的predict_proba方法来得到语句的估计概率(estimated probabilities),作为预测可疑度,与频谱可疑度结合以提高缺陷定位的准确性。
实验运行硬件环境为Intel Xeon E5-2678 v3 @ 2.50 GHz、64 GB物理内存;软件环境为Windows 10、JDK 1.8.0、Python 3.7.0。
3.1 实验设计
3.1.1 研究问题
a)为了评估FLFS的缺陷定位性能,本文将其与SBFL中定位效果最好的技术DStar和Ochiai进行对比,以分析本文所提技术的有效性。
b)通过对比使用聚类算法对数据预处理后和不使用聚类方法预处理的方法静态特征数据集训练模型的性能来验证解决方法级静态特征数据集中的类不平衡问题是否会提高FLFS的缺陷定位效果。
3.1.2 數据集
表4给出了Defects4J数据集的相关统计信息,包括来自6个开源项目的395个含有缺陷的版本,Chart(26个缺陷版本)、Closure(133个缺陷版本)、Lang(65个缺陷版本)、Math(106个缺陷版本)、Mockito(38个缺陷版本)和Time(27个缺陷版本)。在表4中,第二列是各项目存在缺陷的版本数量,每个缺陷版本包含至少一个缺陷;第三列是每个项目的平均代码行数。第四列是每个项目的平均测试用例数量。
实验中基于Eclipse的JDT库和所编写的语法分析器,根据2.1节设计的度量元指标,提取Defects4J数据集中6个项目的方法静态特征以构建方法静态特征数据集并进行实验。其中,训练集和测试集的划分方式为轮流选取一个项目作为测试集,剩余五个项目数据则作为训练集。
3.1.3 评价指标
为评价FLFS的有效性,本文采用Einspect@n和MRR(mean reciprocal rank)两个被广泛使用的评价指标。
Einspect@n是指可疑度值排在前n的方法中存在缺陷的数量,n越小且Einspect@n的值越大,缺陷定位技术的性能就越好。与语句级缺陷定位的评估过程类似,本文通过统计可疑度值排在前n的方法中存在的缺陷数量对不同技术进行评估。
MRR也是一种对缺陷定位技术进行评估的通用评价指标,通过查找可疑列表中第一个包含缺陷的方法,并计算其排名的倒数值来评估缺陷定位技术的性能,MRR值越高,说明定位技术的准确率越高。MRR计算公式如式(2)所示。其中R为该程序所有含有缺陷方法的集合,|R|表示集合中缺陷方法的数目,ranki表示定位出的与第i个缺陷方法最靠前排名[28]。
MRR=1|R|∑Ri=11ranki(2)
3.2 实验结果分析
表5为DStar、Ochiai、FLFSDStar和FLFSOchiai对Defects4J数据集进行缺陷定位的效果对比,其中FLFSDStar表示将缺陷预测模型预测的预测可疑度与DStar计算的频谱可疑度值进行融合,FLFSOchiai表示与Ochiai计算的频谱可疑度值进行融合。实验使用的评价指标为Einspect@n(n=1,3,5)和MRR。
对于Einspect@n,当n=1、3、5时,FLFS均取得了更好的定位效果,相比DStar、Ochiai分别能够多定位到5~16个缺陷,且当n=1时,FLFS能够表现出更有效的缺陷定位性能。具体地,当n=1时,FLFSDStar、FLFSOchiai相比DStar、Ochiai分别能够多定位16和10个缺陷;当n=3时,FLFSDStar、FLFSOchiai相比DStar、Ochiai分别能够多定位到12和8个缺陷;当n=5时,FLFSDStar、FLFSOchiai相比DStar、Ochiai分别能够多定位到8和5个缺陷。对于MRR,FLFSDStar在除Lang外的五个项目上相比DStar的MRR值均更高;FLFSOchiai在Chart、Math、Time三个项目上相比Ochiai的MRR值均更高。其中,DStar和Ochiai在Lang项目上相比FLFS均有更好的定位效果,原因是DStar和Ochiai在Lang项目上已经取得了比其他五个项目更好的缺陷定位效果,导致在融合代码结构信息后定位性能提升空间有限,甚至可能会降低缺陷定位效果。此外还可以发现FLFS技术的定位效果会受到所融合技术定位效果的影响,通过实验结果可以看出,FLFS与所融合的SBFL技术的定位效果呈正相关。例如,对于Chart、Math和Closure项目,Ochiai的定位效果均优于DStar,因此FLFSOchiai相比FLFSDStar的性能也更好。
实验结果表明,针对问题a),对于Einspect@n(n=1),FLFS相比DStar和Ochiai均取得了更好的定位效果,分别多定位到16和10个缺陷,提升了13.22%和7.63%;对于MRR,FLFS相比DStar和Ochiai分别提升了4.12%和1.09%。此外,FLFS的性能与所融合的SBFL技术的缺陷定位性能正相关。
为了评价方法静态特征数据集中存在的类不平衡问题对FLFS缺陷定位效果的影响,本文将不通过聚类选取方法静态特征数据集中不存在缺陷方法的FLFS表示为FLFS w/o clustering,并与FLFS进行比较,结果如表6所示。其中FLFSDStar w/o Clustering和FLFSOchiai w/o Clustering分别表示使用DStar和Ochiai计算频谱可疑度。
从表5、6中可以看出,对于Einspect@n和MRR指标,FLFSDStar和FLFSOchiai分别取得了比FLFSDStar w/o Clustering和FLFSOchiai w/o Clustering更好的定位效果。对于Einspect@n指标,除n=1时,FLFSDStar w/o Clustering比DStar多定位到1个缺陷外,FLFSDStar w/o Clustering和FLFSOchiai w/o Clustering的定位效果甚至弱于DStar和Ochiai。例如,当n=3时,FLFSDStar w/o Clustering比DStar、FLFSDStar分别少定位到2和14个缺陷;FLFSOchiai w/o Clustering比Ochiai和FLFSOchiai分别少定位到5和13个缺陷。当n=1时,缓解方法静态特征数据集中存在的类不平衡问题对FLFS定位效果提升最为明显,FLFSDStar比FLFSDStar w/o Clustering提高了12.30%,FLFSOchiai比FLFSOchiai w/o Clustering提高了10.16%。而对于MRR指标,FLFSDStar比FLFSDStar w/o clustering提高了7.87%,FLFSOchiai比FLFSOchiai w/o Clustering提高了5.14%。
综合以上分析,针对问题b),使用聚类方法处理数据集的类不平衡问题能够有效提升缺陷预测模型的性能,进而提升缺陷定位效果。若不对数据集的类不平衡问题进行处理,直接将预测可疑度和频谱可疑度融合,将不能提高SBFL的缺陷定位性能。
4 分析讨论
4.1 FLFS使用不同融合方式时缺陷定位的性能
FLFS通过式(1)使用数值相乘的方式来融合缺陷预测模型的预测可疑度与SBFL的频谱可疑度,得到各方法的融合可疑度值。除了这种方式外,还可以使用其他方式将频谱可疑度和预测可疑度进行融合。例如,参考缺陷定位领域中融合历史谱和频谱可疑度的工作HSFL[7]以及融合代码异味和文本相似度的工作BLI[29],对频谱可疑度和预测可疑度使用权重相加方式进行融合,计算方式如式(3)所示。
M′(i)=k×spectrum(i)+(1-k)×prediction(i)(3)
其中:M′(i)表示第i个方法通过不同权重相加计算的融合可疑度值,而spectrum(i)和prediction(i)分别表示该方法的频谱可疑度和预测可疑度;k是用来融合频谱可疑度和预测可疑度的权重。参考HSFL和BLI的实验设置,本文将k分别设置为0.1、0.3、0.5、0.7、0.9,通过实验和FLFS进行对比。
本文将使用权重相加的方式计算融合可疑度的FLFS技术表示为FLFS′,其缺陷定位结果如表7、8所示。表中数据为FLFS′在不同项目上Einspect@n(n=1)和MRR的评估表现,FLFS′DStar和FLFS′Ochiai分别表示使用权重相加方式将缺陷预测模型预测的预测可疑度与DStar、Ochiai的频谱可疑度进行融合。可以看出,k的取值越高,FLFS′的定位效果越好,当k=0.9时,对于Einspect@1,FLFS′DStar虽然比DStar多定位到8个缺陷,但仍比FLFSDStar少定位到8个缺陷;而FLFS′Ochiai虽然比Ochiai多定位到3个缺陷,但仍比FLFSOchiai少定位到7个缺陷。此外,对于MRR,FLFS′DStar和FLFS′Ochiai的MRR平均值分别低于DStar、FLFSDStar和Ochiai、FLFSOchiai。实验结果表明,融合可疑度方式的差异会影响FLFS的缺陷定位效果,虽然FLFS′对于Einspect@1指标也能在一定程度上提高基线技术的定位效果,但是当使用相乘的方式来融合预测可疑度和频谱可疑度时,能取得更好的缺陷定位效果。
4.2 有效性分析
外部有效性与本文实验使用的数据集有关。本文使用Defecst4J作为实验对象,它包括来自6个开源项目的395个缺陷。该数据集被广泛用于评估缺陷定位方法的性能[25]。Defects4J数据集虽然具有一定的代表性,但无法保证FLFS在其他数据集上能得到相同的结果。此外,本文仅在实验中使用了性能最好的SBFL技术(DStar和Ochiai)、常用的缺陷预测模型(RF)和被广泛使用的聚类算法。上述技术虽然具有一定的代表性,但不能确保融合其他SBFL技术和缺陷预测技术进行软件缺陷定位时具有相同效果。
内部有效性主要体现在方法实现及实验过程的正确性。为缓解内部有效性威胁,使用第三方机器学习库Scikit-learn实现的K-means算法对方法级静态特征数据集中正确的数据进行聚类。由于DStar和Ochiai都未开源且方法易于实现,所以本文对其复现后在Defects4J数据集上进行了实验,并将实验结果与相关研究进行对比验证,以确保实验的正确性。此外,在实验过程中对所编写的代码进行了多次检查和测试,尽可能减少内部有效性威胁。构造有效性主要与实验使用的评价指标有关。本文使用Einspect@n和MRR作为本文方法有效性的评价指标。其中,将Einspect@n用于统计缺陷定位的绝对排名,因为开发人员在检查给定的可疑元素列表时更关注排名靠前的缺陷元素,所以实验中重点关注了Einspect@n(n=1);而MRR则用于统计缺陷定位的相对排名。两种评价指标已被广泛应用在软件缺陷定位领域[30]。
5 结束语
针对现有基于频谱的缺陷定位方法中分析代码信息不足导致精度和定位效果有限的问题,本文提出了一种融合代码静态特征和频谱的软件缺陷定位技术FLFS,通过将缺陷预测中使用到的代码结构信息和SBFL的频谱信息融合使用,以提升缺陷定位技术的性能。在Defects4J数据集上进行的实验结果表明,对于Einspect@n和MRR,FLFS比SBFL技术均取得了更好的缺陷定位效果。在下一步工作中,尝试将更多聚类方法应用于FLFS,同时融合更多SBFL技术并深入分析FLFS用于软件多缺陷定位的效果;此外,还将尝试在更多更大规模的数据集上进行实验,以进一步验证FLFS的有效性。
参考文献:
[1]陈翔,鞠小林,文万志,等.基于程序频谱的动态缺陷定位方法研究[J].软件学报,2015,26(2):390-412.(Chen Xiang,Ju Xiaolin,Wen Wanzhi,et al.Review of dynamic fault localization approaches based on program spectrum[J].Journal of Software,2015,26(2):390-412.)
[2]朱潤凝,赵逢禹.一种基于谓词分层覆盖矩阵的缺陷定位方法[J].计算机应用研究,2016,33(8):2375-2380,2395.(Zhu Running,Zhao Fengyu.Fault localization method based on predicate hierarchical coverage matrix[J].Application Research of Computers,2016,33(8):2375-2380,2395.)
[3]張文,李自强,杜宇航,等.方法级别的细粒度软件缺陷定位方法[J].软件学报,2019,30(2):195-210.(Zhang Wen,Li Ziqiang,Du Yuhang,et al.Fine-grained software bug location approach at method level[J].Journal of Software,2019,30(2):195-210.)
[4]Wong W E,Debroy V,Gao Ruizhi,et al.The DStar method for effective software fault localization[J].IEEE Trans on Reliability,2013,63(1):290-308.
[5]Just R,Jalali D,Ernst M D.Defects4J:a database of existing faults to enable controlled testing studies for Java programs[C]//Proc of International Symposium on Software Testing and Analysis.New York:ACM Press,2014:437-440.
[6]姜淑娟,张旭,王荣存,等.基于路径分析和信息熵的错误定位方法[J].软件学报,2021,32(7):2166-2182.(Jiang Shujuan,Zhang Xu,Wang Rongcun,et al.Fault localization approach based on path analysis and information entropy[J].Journal of Software,2021,32(7):2166-2182.)
[7]Wen Ming,Chen Junjie,Tian Yongqiang,et al.Historical spectrum based fault localization[J].IEEE Trans on Software Engineering,2019,47(11):2348-2368.
[8]Saha R K,Lease M,Khurshid S,et al.Improving bug localization using structured information retrieval[C]//Proc of the 28th IEEE/ACM International Conference on Automated Software Engineering.Piscataway,NJ:IEEE Press,2013:345-355.
[9]Jain A,Zongker D.Feature selection:evaluation,application,and small sample performance[J].IEEE Trans on Pattern Analysis and Machine Intelligence,1997,19(2):153-158.
[10]LeCun Y,Bengio Y,Hinton G.Deep learning[J].Nature,2015,521(7553):436-444.
[11]Li Yi,Wang Shaohua,Nguyen T N.Vulnerability detection with fine-grained interpretations[C]//Proc of the 29th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering.New York:ACM Press,2021:292-303.
[12]Abreu R,Zoeteweij P,Golsteijn R,et al.A practical evaluation of spectrum-based fault localization[J].Journal of Systems and Software,2009,82(11):1780-1792.
[13]Zhou Jian,Zhang Hongyu,Lo D.Where should the bugs be fixed? More accurate information retrieval-based bug localization based on bug reports[C]//Proc of the 34th International Conference on Software Engineering.Piscataway,NJ:IEEE Press,2012:14-24.
[14]Jones J A,Harrold M J.Empirical evaluation of the tarantula automatic fault-localization technique[C]//Proc of the 20th IEEE/ACM International Conference on Automated Software Engineering.New York:ACM Press,2005:273-282.
[15]Xie Xiaoyuan,Wong W E,Chen T Y,et al.Metamorphic slice:an application in spectrum-based fault localization[J].Information and Software Technology,2013,55(5):866-879.
[16]陈翔,顾庆,刘望舒,等.静态软件缺陷预测方法研究[J].软件学报,2016,27(1):1-25.(Chen Xiang,Gu Qing,Liu Wangshu,et al.Survey of static software defect prediction[J].Journal of Software,2016,27(1):1-25.)
[17]Elish K O,Elish M O.Predicting defect-prone software modules using support vector machines[J].Journal of Systems and Software,2008,81(5):649-660.
[18]Catal C,Diri B.Investigating the effect of dataset size,metrics sets,and feature selection techniques on software fault prediction problem[J].Information Sciences,2009,179(8):1040-1058.
[19]Russell R,Kim L,Hamilton L,et al.Automated vulnerability detection in source code using deep representation learning[C]//Proc of the 17th IEEE International Conference on Machine Learning and Applications.Piscataway,NJ:IEEE Press,2018:757-762.
[20]Dam H K,Tran T,Pham T,et al.Automatic feature learning for vulnerability prediction[EB/OL].(2017-08-08).https://arxiv.org/abs/1708.02368.
[21]Halstead M H.Elements of software science[M].New York:Elsevier Science Inc.,1977.
[22]Chidamber S R,Kemerer C F.A metrics suite for object oriented design[J].IEEE Trans on Software Engineering,1994,20(6):476-493.
[23]Martin R.OO design quality metrics:an analysis of dependencies[EB/OL].(1994-10-28).https://www.cin.ufpe.br/~alt/mestrado/oodmetrc.pdf.
[24]McCabe T J.A complexity measure[J].IEEE Transactions on Software Engineering,1976,SE-2(4):308-320.
[25]張卓,雷晏,毛晓光,等.基于词频-逆文件频率的错误定位方法[J].软件学报,2020,31(11):3448-3460.(Zhang Zhuo,Lei Yan,Mao Xiaoguang,et al.Fault localization using term frequency-inverse document frequency[J].Journal of Software,2020,31(11):3448-3460.
[26]Tanha J,Abdi Y,Samadi N,et al.Boosting methods for multi-class imbalanced data classification:an experimental review[J].Journal of Big Data,2020,7(9):article No.70.
[27]胡小生,张润晶,钟勇.两层聚类的类别不平衡数据挖掘算法[J].计算机科学,2013,40(11):271-275.(Hu Xiaosheng,Zhang Runjing,Zhong Yong.Two-tier clustering for mining imbalanced datasets[J].Computer Science,2013,40(11):271-275.)
[28]Voorhees E M.The TREC-8 question answering track report[EB/OL].(2000-12-11).https://tsapps.nist.gov/publication/get_pdf.cfm?pub_id=151495.
[29]Takahashi A,Sae-Lim N,Hayashi S,et al.A preliminary study on using code smells to improve bug localization[C]//Proc of the 26th Conference on Program Comprehension.New York:ACM Press,2018:324-327.
[30]Zou Daming,Liang Jingjing,Xiong Yingfei,et al.An empirical study of fault localization families and their combinations[J].IEEE Trans on Software Engineering,2021,47(2):332-347.
收稿日期:2023-02-20;修回日期:2023-04-13 基金项目:国家自然科学基金资助项目(61702041);北京市教委科技计划资助项目(KM201811232016);北京信息科技大学“勤信人才”培育计划资助项目(QXTCPC201906)
作者简介:王浩仁(1997-),男,河北石家庄人,硕士,CCF会员,主要研究方向为软件缺陷定位;岳雷(1998-),男,甘肃兰州人,硕士研究生,主要研究方向为软件缺陷定位;李静雯(1999-),女,河北沧州人,硕士研究生,主要研究方向为软件缺陷定位;崔展齐(1984-),男(通信作者),贵州金沙人,教授,硕导,博士,主要研究方向为软件分析与软件测试技术(czq@bistu.edu.cn).