劉艾俠, 劉丹丹(. 寶雞職業(yè)技術(shù)學(xué)院, 寶雞 7203; 2. 中國(guó)科學(xué)院大學(xué), 北京 00039;3. 中國(guó)科學(xué)院 國(guó)家授時(shí)中心, 西安 70600)
基于代碼結(jié)構(gòu)信息和歷史缺陷報(bào)告軟件缺陷定位研究
劉艾俠1, 劉丹丹2,3
(1. 寶雞職業(yè)技術(shù)學(xué)院, 寶雞 721013; 2. 中國(guó)科學(xué)院大學(xué), 北京 100039;3. 中國(guó)科學(xué)院 國(guó)家授時(shí)中心, 西安 710600)
靜態(tài)缺陷定位通常采用信息檢索的方法,現(xiàn)有的信息檢索方法一般采用源代碼與缺陷報(bào)告的文本相似性的排序方法,但是這種基于文本相似性的方法沒(méi)能充分利用源代碼結(jié)構(gòu)信息,缺陷定位的準(zhǔn)確率較低。為了解決這個(gè)問(wèn)題,提出了一種基于源代碼結(jié)構(gòu)信息(如類名、方法名、變量名、注釋等)和歷史缺陷報(bào)告信息進(jìn)行缺陷定位的方法。對(duì)于源代碼結(jié)構(gòu)的不同部分,在與缺陷報(bào)告進(jìn)行詞語(yǔ)匹配時(shí),賦予它們不同的權(quán)重,同時(shí)充分利用歷史缺陷報(bào)告信息,提高缺陷定位的精度。最后為了驗(yàn)證基于代碼結(jié)構(gòu)信息的缺陷定位技術(shù)的有效性,與以前提出的BugLocator、BugScout等方法進(jìn)行了比較,結(jié)果表明基于代碼結(jié)構(gòu)信息的軟件缺陷定位方法比BugLocator和BugScout方法準(zhǔn)確度有明顯提高。
代碼結(jié)構(gòu); 缺陷定位; 缺陷報(bào)告; 歷史缺陷報(bào)告
Abstract: Static bug localization method commonly uses information retrieval method to locate bug. Existing information retrieval methods generally use text similarity between the source codes and bug reports, but the text similarity method fails to make full use of the source code structure information, and has low accuracy. In order to solve this problem, this paper presents a bug localization method using source code structure (such as the class name, method names, variable names, comment etc.) and historical bug report information. When different parts of the source code structure match the bug report, they are given different weights. The paper also makes full use of the historical bug report information to improve the accuracy of bug localization. Finally in order to validate the method, this paper is compared the proposed method with BugLocator and BugScout, the results show that software bug localization method based on source code structure has significant advantage than the BugLocator and the BugScout.
Keywords: Code structure; Bug localization; Bug report; Historical bug report
軟件缺陷(bug)是影響軟件質(zhì)量的重要因素之一,缺陷的存在經(jīng)常導(dǎo)致系統(tǒng)的失效和崩潰,給系統(tǒng)的可信運(yùn)行帶來(lái)挑戰(zhàn)[1]。近年來(lái),缺陷定位技術(shù)受到諸多國(guó)內(nèi)外學(xué)者廣泛研究,并已經(jīng)取得了較為顯著的結(jié)果?,F(xiàn)今缺陷定位技術(shù)主要分為三類,靜態(tài)缺陷定位技術(shù)[2]和動(dòng)態(tài)缺陷定位技術(shù)[2]以及動(dòng)靜結(jié)合的缺陷定位技術(shù)[3]。靜態(tài)缺陷定位通常使用文本信息檢索技術(shù)來(lái)比較缺陷報(bào)告和源代碼文件之間的相似性,如常用的向量空間模型和隱性語(yǔ)義索引等。信息檢索技術(shù)從程序源代碼中抽取文本,然后計(jì)算與缺陷報(bào)告之間的文本相似性,相似性越高意味著源代碼文件和缺陷報(bào)告關(guān)聯(lián)的嫌疑度越大[4]。但是,現(xiàn)有的信息檢索技術(shù)僅僅把源代碼視為一種普通文本,沒(méi)有考慮代碼文件中的結(jié)構(gòu)信息,如果能充分利用這些結(jié)構(gòu)信息,就可以進(jìn)一步提高缺陷定位的精度[5]。本文認(rèn)為一個(gè)缺陷報(bào)告通常是一個(gè)或多個(gè)類的代碼錯(cuò)誤引起的,與通常的文本相似性匹配不同,本文直接分析類與缺陷報(bào)告的相似性,研究源代碼結(jié)構(gòu)信息對(duì)缺陷定位的影響,利用了源代碼不同的結(jié)構(gòu)信息、文本信息與缺陷報(bào)告之間的相似性,并在其中加入了權(quán)重的因素,使其可以根據(jù)不同情況進(jìn)行動(dòng)態(tài)調(diào)整。另外,還考慮了用不同缺陷報(bào)告之間的文本相似性,來(lái)進(jìn)一步提高定位精準(zhǔn)度。
現(xiàn)有的基于信息檢索的缺陷定位方法僅僅把源代碼視為一種缺乏結(jié)構(gòu)的普通文本,沒(méi)有考慮代碼文件中的結(jié)構(gòu)信息[6]。事實(shí)上,源代碼豐富的結(jié)構(gòu)如類名、方法名、變量名和注釋等有著重要的作用。雖然忽視這些結(jié)構(gòu)能簡(jiǎn)化缺陷定位運(yùn)算,但是也失去了用結(jié)構(gòu)化信息提高缺陷定位的機(jī)會(huì)。源代碼豐富的結(jié)構(gòu),包、類、屬性、方法、注釋之間有明確的結(jié)構(gòu)關(guān)系,而這些結(jié)構(gòu)信息對(duì)于缺陷定位有重要價(jià)值,可以幫助開(kāi)發(fā)者提高缺陷定位精度[7]。通常這些重要的信息經(jīng)常迷失在大量的變量名和注釋詞語(yǔ)中。
為了提高定位精度,本文提出需要充分利用代碼結(jié)構(gòu)信息和歷史缺陷報(bào)告信息進(jìn)行缺陷定位。缺陷定位流程,如圖1所示。
圖1 缺陷定位流程
首先提取軟件系統(tǒng)中java源代碼文件;運(yùn)用Eclipse AST抽取java文件中的類名、方法名、變量名和注釋,同時(shí)進(jìn)行預(yù)處理去除注釋中的無(wú)用停止詞等,然后把這些標(biāo)識(shí)符組成源代碼的XML結(jié)構(gòu)化文件;獲取新的缺陷報(bào)告,提取缺陷報(bào)告的摘要和內(nèi)容,并對(duì)其進(jìn)行預(yù)處理;將源代碼的XML結(jié)構(gòu)化文件和缺陷報(bào)告進(jìn)行結(jié)構(gòu)化相似匹配運(yùn)算,并進(jìn)行加權(quán),這一步稱為源代碼結(jié)構(gòu)化的軟件缺陷定位;獲取歷史缺陷報(bào)告,將新缺陷報(bào)告與歷史缺陷報(bào)告進(jìn)行VSM相似性計(jì)算,獲取每一個(gè)源代碼文件所關(guān)聯(lián)的歷史缺陷報(bào)告與新缺陷報(bào)告VSM相似性最大值作為利用歷史缺陷報(bào)告進(jìn)行缺陷定位的相似性分?jǐn)?shù);將源代碼結(jié)構(gòu)化的缺陷定位分?jǐn)?shù)和利用歷史缺陷報(bào)告進(jìn)行缺陷定位得出的分?jǐn)?shù)進(jìn)行加權(quán),進(jìn)行最終的缺陷定位計(jì)算。
(1) 構(gòu)建源代碼中類的XML文檔
對(duì)源代碼使用Eclipse中的JDT技術(shù)構(gòu)建抽象語(yǔ)法樹(shù)(AST),通過(guò)抽象語(yǔ)法樹(shù)來(lái)提取程序結(jié)構(gòu)如:類名、方法名、變量名和注釋,對(duì)注釋內(nèi)容進(jìn)行去除停止詞等預(yù)處理,每個(gè)源代碼文件的信息儲(chǔ)存為一個(gè)XML結(jié)構(gòu)化文檔[8]。
(2) 源代碼結(jié)構(gòu)化缺陷定位計(jì)算
為了分析某個(gè)源代碼文件與缺陷報(bào)告之間的結(jié)構(gòu)化相似度,本文先獲取一個(gè)新的缺陷報(bào)告。本文先對(duì)缺陷報(bào)告進(jìn)行去除停止詞等預(yù)處理后,然后用每個(gè)源代碼文件的結(jié)構(gòu)化信息內(nèi)容(Class Name,Method Name,Variable和Comment)中的4部分分別對(duì)缺陷報(bào)告進(jìn)行詞語(yǔ)匹配,統(tǒng)計(jì)出現(xiàn)的次數(shù),如表1所示。
表1 源代碼結(jié)構(gòu)化信息與缺陷報(bào)告詞語(yǔ)匹配次數(shù)
缺陷與代碼結(jié)構(gòu)化相似度計(jì)算式,如式(1)。
(1)
其中a,b,c,d分別表示類名、方法名、變量名和注釋的權(quán)重,通過(guò)調(diào)整模型中的權(quán)重,就可以改變類名、方法名、變量名和注釋在缺陷定位時(shí)所占的重要性。
給定一個(gè)缺陷報(bào)告,使用公式(1)中的StructScore計(jì)算每個(gè)源代碼文件和缺陷報(bào)告之間的相關(guān)分?jǐn)?shù),根據(jù)分?jǐn)?shù)由高到低得出相關(guān)源代碼文件的排名列表。
(3)歷史缺陷報(bào)告信息的運(yùn)用
每個(gè)歷史缺陷報(bào)告關(guān)聯(lián)著若干源代碼文件,如果新缺陷報(bào)告與歷史缺陷報(bào)告相似度較高,那么歷史缺陷報(bào)告關(guān)聯(lián)的源代碼文件就有可能是需要定位的缺陷文件。為充分利用歷史缺陷報(bào)告信息,對(duì)于一個(gè)新的缺陷報(bào)告,本文提出利用該報(bào)告與歷史缺陷報(bào)告的相似性來(lái)調(diào)整相關(guān)源代碼文件的排名。這里利用VSM來(lái)計(jì)算缺陷報(bào)告之間的相似性。在VSM中,每個(gè)處理后的缺陷報(bào)告被作為一個(gè)n維向量,n是出現(xiàn)在缺陷報(bào)告中詞語(yǔ)的個(gè)數(shù),wi是n維向量中第i個(gè)詞語(yǔ)的權(quán)重。一個(gè)詞語(yǔ)t在文檔d中的權(quán)重可以用式(2)計(jì)算。
(2)
其中t表示詞語(yǔ),d表示一個(gè)缺陷報(bào)告,e,是詞語(yǔ)t出現(xiàn)在d中的次數(shù),N是缺陷報(bào)告總數(shù),nt是含有詞語(yǔ)t的缺陷報(bào)告總數(shù),缺陷報(bào)告之間的相似性得余弦式(3)。
(3)
(4) 最終缺陷定位計(jì)算
對(duì)StructScore和SimiScore進(jìn)行加權(quán)組合,得出一個(gè)源代碼文件總分?jǐn)?shù)如式(4)。
FinalScore=(1-k)×StructScore+k×SimiScore
(4)
其中k是權(quán)重參數(shù),它的范圍在0~1之間,參數(shù)k根據(jù)多次實(shí)驗(yàn),選取最優(yōu)值。源代碼文件按照FinalScore分?jǐn)?shù),由高到底遞減排列,源代碼文件排的越高,越是有可能和缺陷報(bào)告相關(guān)性大。
本文在實(shí)驗(yàn)過(guò)程中,使用NetBeans作為開(kāi)發(fā)工具。為了研究使用代碼結(jié)構(gòu)化信息和歷史缺陷報(bào)告信息是否能提高缺陷定位的精確度,本文選取了Eclipse開(kāi)源項(xiàng)目作為測(cè)試集,并且Eclipse的版本和BugLocator方法中Eclipse的版本相同,以便進(jìn)行比較。Eclipse3.1數(shù)據(jù)集總共包含了3075個(gè)缺陷報(bào)告,為Eclipse項(xiàng)目數(shù)據(jù)集,如表2所示。
表2 Eclipse項(xiàng)目數(shù)據(jù)集
本文選取了一部分缺陷報(bào)告作為歷史缺陷報(bào)告,以便進(jìn)行實(shí)驗(yàn)。
本文用StructLocato表示本文的源代碼結(jié)構(gòu)化缺陷定位方法[8],用StructSimiLoactor表示源代碼結(jié)構(gòu)化和歷史缺陷報(bào)告相結(jié)合的方法。對(duì)于式(1)中a,b,c,d權(quán)重的取值,本文經(jīng)過(guò)一部分實(shí)驗(yàn),選取了其最優(yōu)取值a=0.6,b=0.2,c=0.1,d=0.1。由于本文和BugLocator[9]使用了相同的Eclipse數(shù)據(jù)集,因此可以和BugLocator做比較。經(jīng)過(guò)大量實(shí)驗(yàn)后,本文獲得了源代碼文件的前N排名,并計(jì)算出了MAP和MRR的值。如表3、表4所示。表3、表4中BugLocator方法的數(shù)據(jù)來(lái)自于他們的論文中。表3顯示了使用BugLocator方法和本文的StructLocator方法的缺陷定位比較,由于沒(méi)有加入歷史缺陷報(bào)告相似性,所以k=0。實(shí)驗(yàn)結(jié)果顯示StructLocator方法比BugLocator方法能定位更多缺陷。例如,對(duì)于Eclipse,使用StructLocator方法返回的相關(guān)源代碼文件位于Topl的缺陷報(bào)告數(shù)目占總數(shù)的29.4%,而使用BugLocator方法定位到的缺陷報(bào)告僅僅只有24.4%,Top5和Top10也有類似的趨勢(shì),StructLocator方法的MAP和MRR數(shù)值(MAP=0.29,MRR=0.40)要高于BugLocator的MAP和MRR(MAP=0.26,MRR=0.35),表明在Eclipse中StructLoactor方法的缺陷源文件的整體排名比BugLocator的高。
表3 沒(méi)有使用歷史缺陷報(bào)告下的實(shí)驗(yàn)對(duì)比
表4顯示了使用BugLocator方法和本文的StructSimiLoactor方法的缺陷定位比較,經(jīng)測(cè)試比較,本文選取k權(quán)重因子為k=0.2。對(duì)于Eclipse的測(cè)試結(jié)果:
1) 在Topl中,使用StructSimiLoactor方法定位的缺陷報(bào)告占總數(shù)的32.7%而使用BugLocator方法定位的缺陷報(bào)告只占29.1%
2) 在Top5中,使用StructSimiLoactor方法定位的缺陷報(bào)告占56.0%,而使用BugLocator方法定位的缺陷報(bào)告只占53.8%}
3) 在Top10中,使用StructSimiLoactor方法定位的缺陷報(bào)告占65.3%,而使用BugLocator方法定位的缺陷報(bào)告只占62.6%
4) StructSimiLoactor方法的MAP和MRR數(shù)值分別是MAP=0.32}MRR=0.43而B(niǎo)ugLocator的MAP和MRR數(shù)值分別是MAP=0.30}MRR=0.410
以上數(shù)據(jù)表明在Eclipse中StructSimiLoactor方法的缺陷源文件的整體排名比BugLocator的高。
表4 StructSimiLoactor和BugLocator的實(shí)驗(yàn)對(duì)比
本文也同BugScout做了比較[10],如圖2所示。
圖2 在Eclipse中不同的缺陷定位方法對(duì)比
Nguyen等人使用了Eclipse數(shù)據(jù)集作為他們的實(shí)驗(yàn)項(xiàng)目的一部分來(lái)評(píng)測(cè)BugScout,由于本文的Eclipse數(shù)據(jù)集和BugScout中Eclipse的版本不同,本文只列出了BugScout在Topl、Top5、Top10的概率。從圖2中可以看出:
1) 在Topl的位置,3個(gè)方法的缺陷定位概率大小比較是:
StructSimiLoactor>Buglocator>BugScout。
2) 在Top5和Top10的位置也有1)中類似的趨勢(shì)。
以上數(shù)據(jù)表明,StructSimiLoactor比Buglocator和BugScout表現(xiàn)出色。
本文提出了使用源代碼結(jié)構(gòu)化信息(如類名、方法名、變量名、注釋等)來(lái)提高缺陷定位的方法,本文將源代碼文件結(jié)構(gòu)的不同部分分別與缺陷報(bào)告進(jìn)行匹配,對(duì)每一部分賦予不同的權(quán)值,然后進(jìn)行加權(quán)求和,獲得源代碼結(jié)構(gòu)化的缺陷定位。為了更好的提高缺陷定位的精度,本文還充分利用了歷史缺陷報(bào)告信息。對(duì)歷史缺陷報(bào)告和新缺陷報(bào)告進(jìn)行VSM相似性計(jì)算,將每個(gè)源代碼關(guān)聯(lián)的所有歷史缺陷報(bào)告分別與新缺陷報(bào)告進(jìn)行相似性計(jì)算,將相似性計(jì)算的最大值作為這個(gè)源代碼文件的利用歷史缺陷報(bào)告的缺陷定位分?jǐn)?shù)。將源代碼結(jié)構(gòu)化的缺陷定位和利用歷史缺陷報(bào)告的缺陷定位分別賦予不同的權(quán)值,進(jìn)行加權(quán)組合,獲得最終的缺陷定位排名。最后對(duì)于所有的源文件,排名最高的文件嫌疑度最大。
[1] National Institute of Standards and Technology(NIST). Software Errors Cost U. S. Economy $59. 5 Billion Annually[R], June 28, 2002.
[2] 梁成才, 章代雨, 林海靜. 軟件缺陷的綜合研究 [J]. 計(jì)算機(jī)工程, 2006, 32(19):88-90.
[3] 古可, 劉超, 金茂忠, 等. C++代碼缺陷自動(dòng)檢測(cè)工具的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)應(yīng)用研究, 2009, 26(5):1628-1631.
[4] 丁暉, 陳林, 錢巨, 等.一種基于信息量的缺陷定位方法[J]. 軟件學(xué)報(bào), 2013, 24(7):1484-1494.
[5] 趙磊, 王麗娜, 高東明,等. 基于關(guān)聯(lián)挖掘的軟件錯(cuò)誤定位方法[J]. 計(jì)算機(jī)學(xué)報(bào), 2012, 35(12):2529-2539.
[6] Moreno L, Bandara W, Haiduc S, et al. On the Relationship between the Vocabulary of Bug Reports and Source Code[C]// 2013 IEEE International Conference on Software Maintenance. IEEE Computer Society, 2013:452-455.
[7] 梁廣泰, 王千祥. CODAS:一個(gè)易擴(kuò)展的靜態(tài)代碼缺陷分析服務(wù)[J]. 軟件學(xué)報(bào), 2012, 39(1):14-17
[8] 陳翔, 鞠小林, 文萬(wàn)志, 等. 基于程序頻譜的動(dòng)態(tài)缺陷定位方法研究[J]. 軟件學(xué)報(bào), 2015, 26(2):390-412.
[9] Poshyvanyk D, Uueheneuc Y G, Marcus A, et al. Feature Location Using Probabilistic Ranking of Methods Based on Execution Scenarios and Information Retrieval[J]. IEEE Transactions on Software Engineering, 2007, 33(6):420-432.
[10] Manning C D, Raghavan P, Schiatze H. Introduction to information retrieval[J]. Citeseer, 2008, 43(3):824-825.
ResearchofSoftwareDefectPositioningBasedontheCodeStructureInformationandHistoryDefectReport
Liu Aixia1, Liu Dandan2,3
(1. Baoji Vocational Technology College, Baoji 721013, China; 2. University of Chinese Academy of Science, Beijing 10039, China; 3. National Time ServiceCenter, Chinese Academy of Science, Xi’an 710600, China)
TP311
A
2017.06.26)
劉艾俠(1982-),女,陜西周至人,碩士,講師,研究方向:計(jì)算機(jī)技術(shù)。 劉丹丹(1983-),女,河南焦作人,碩士,助理研究員,研究方向:計(jì)算機(jī)軟件設(shè)計(jì)。
1007-757X(2017)09-0047-03