劉艾俠, 劉丹丹(. 寶雞職業(yè)技術(shù)學院, 寶雞 7203; 2. 中國科學院大學, 北京 00039;3. 中國科學院 國家授時中心, 西安 70600)
基于代碼結(jié)構(gòu)信息和歷史缺陷報告軟件缺陷定位研究
劉艾俠1, 劉丹丹2,3
(1. 寶雞職業(yè)技術(shù)學院, 寶雞 721013; 2. 中國科學院大學, 北京 100039;3. 中國科學院 國家授時中心, 西安 710600)
靜態(tài)缺陷定位通常采用信息檢索的方法,現(xiàn)有的信息檢索方法一般采用源代碼與缺陷報告的文本相似性的排序方法,但是這種基于文本相似性的方法沒能充分利用源代碼結(jié)構(gòu)信息,缺陷定位的準確率較低。為了解決這個問題,提出了一種基于源代碼結(jié)構(gòu)信息(如類名、方法名、變量名、注釋等)和歷史缺陷報告信息進行缺陷定位的方法。對于源代碼結(jié)構(gòu)的不同部分,在與缺陷報告進行詞語匹配時,賦予它們不同的權(quán)重,同時充分利用歷史缺陷報告信息,提高缺陷定位的精度。最后為了驗證基于代碼結(jié)構(gòu)信息的缺陷定位技術(shù)的有效性,與以前提出的BugLocator、BugScout等方法進行了比較,結(jié)果表明基于代碼結(jié)構(gòu)信息的軟件缺陷定位方法比BugLocator和BugScout方法準確度有明顯提高。
代碼結(jié)構(gòu); 缺陷定位; 缺陷報告; 歷史缺陷報告
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)常導致系統(tǒng)的失效和崩潰,給系統(tǒng)的可信運行帶來挑戰(zhàn)[1]。近年來,缺陷定位技術(shù)受到諸多國內(nèi)外學者廣泛研究,并已經(jīng)取得了較為顯著的結(jié)果。現(xiàn)今缺陷定位技術(shù)主要分為三類,靜態(tài)缺陷定位技術(shù)[2]和動態(tài)缺陷定位技術(shù)[2]以及動靜結(jié)合的缺陷定位技術(shù)[3]。靜態(tài)缺陷定位通常使用文本信息檢索技術(shù)來比較缺陷報告和源代碼文件之間的相似性,如常用的向量空間模型和隱性語義索引等。信息檢索技術(shù)從程序源代碼中抽取文本,然后計算與缺陷報告之間的文本相似性,相似性越高意味著源代碼文件和缺陷報告關(guān)聯(lián)的嫌疑度越大[4]。但是,現(xiàn)有的信息檢索技術(shù)僅僅把源代碼視為一種普通文本,沒有考慮代碼文件中的結(jié)構(gòu)信息,如果能充分利用這些結(jié)構(gòu)信息,就可以進一步提高缺陷定位的精度[5]。本文認為一個缺陷報告通常是一個或多個類的代碼錯誤引起的,與通常的文本相似性匹配不同,本文直接分析類與缺陷報告的相似性,研究源代碼結(jié)構(gòu)信息對缺陷定位的影響,利用了源代碼不同的結(jié)構(gòu)信息、文本信息與缺陷報告之間的相似性,并在其中加入了權(quán)重的因素,使其可以根據(jù)不同情況進行動態(tài)調(diào)整。另外,還考慮了用不同缺陷報告之間的文本相似性,來進一步提高定位精準度。
現(xiàn)有的基于信息檢索的缺陷定位方法僅僅把源代碼視為一種缺乏結(jié)構(gòu)的普通文本,沒有考慮代碼文件中的結(jié)構(gòu)信息[6]。事實上,源代碼豐富的結(jié)構(gòu)如類名、方法名、變量名和注釋等有著重要的作用。雖然忽視這些結(jié)構(gòu)能簡化缺陷定位運算,但是也失去了用結(jié)構(gòu)化信息提高缺陷定位的機會。源代碼豐富的結(jié)構(gòu),包、類、屬性、方法、注釋之間有明確的結(jié)構(gòu)關(guān)系,而這些結(jié)構(gòu)信息對于缺陷定位有重要價值,可以幫助開發(fā)者提高缺陷定位精度[7]。通常這些重要的信息經(jīng)常迷失在大量的變量名和注釋詞語中。
為了提高定位精度,本文提出需要充分利用代碼結(jié)構(gòu)信息和歷史缺陷報告信息進行缺陷定位。缺陷定位流程,如圖1所示。
圖1 缺陷定位流程
首先提取軟件系統(tǒng)中java源代碼文件;運用Eclipse AST抽取java文件中的類名、方法名、變量名和注釋,同時進行預處理去除注釋中的無用停止詞等,然后把這些標識符組成源代碼的XML結(jié)構(gòu)化文件;獲取新的缺陷報告,提取缺陷報告的摘要和內(nèi)容,并對其進行預處理;將源代碼的XML結(jié)構(gòu)化文件和缺陷報告進行結(jié)構(gòu)化相似匹配運算,并進行加權(quán),這一步稱為源代碼結(jié)構(gòu)化的軟件缺陷定位;獲取歷史缺陷報告,將新缺陷報告與歷史缺陷報告進行VSM相似性計算,獲取每一個源代碼文件所關(guān)聯(lián)的歷史缺陷報告與新缺陷報告VSM相似性最大值作為利用歷史缺陷報告進行缺陷定位的相似性分數(shù);將源代碼結(jié)構(gòu)化的缺陷定位分數(shù)和利用歷史缺陷報告進行缺陷定位得出的分數(shù)進行加權(quán),進行最終的缺陷定位計算。
(1) 構(gòu)建源代碼中類的XML文檔
對源代碼使用Eclipse中的JDT技術(shù)構(gòu)建抽象語法樹(AST),通過抽象語法樹來提取程序結(jié)構(gòu)如:類名、方法名、變量名和注釋,對注釋內(nèi)容進行去除停止詞等預處理,每個源代碼文件的信息儲存為一個XML結(jié)構(gòu)化文檔[8]。
(2) 源代碼結(jié)構(gòu)化缺陷定位計算
為了分析某個源代碼文件與缺陷報告之間的結(jié)構(gòu)化相似度,本文先獲取一個新的缺陷報告。本文先對缺陷報告進行去除停止詞等預處理后,然后用每個源代碼文件的結(jié)構(gòu)化信息內(nèi)容(Class Name,Method Name,Variable和Comment)中的4部分分別對缺陷報告進行詞語匹配,統(tǒng)計出現(xiàn)的次數(shù),如表1所示。
表1 源代碼結(jié)構(gòu)化信息與缺陷報告詞語匹配次數(shù)
缺陷與代碼結(jié)構(gòu)化相似度計算式,如式(1)。
(1)
其中a,b,c,d分別表示類名、方法名、變量名和注釋的權(quán)重,通過調(diào)整模型中的權(quán)重,就可以改變類名、方法名、變量名和注釋在缺陷定位時所占的重要性。
給定一個缺陷報告,使用公式(1)中的StructScore計算每個源代碼文件和缺陷報告之間的相關(guān)分數(shù),根據(jù)分數(shù)由高到低得出相關(guān)源代碼文件的排名列表。
(3)歷史缺陷報告信息的運用
每個歷史缺陷報告關(guān)聯(lián)著若干源代碼文件,如果新缺陷報告與歷史缺陷報告相似度較高,那么歷史缺陷報告關(guān)聯(lián)的源代碼文件就有可能是需要定位的缺陷文件。為充分利用歷史缺陷報告信息,對于一個新的缺陷報告,本文提出利用該報告與歷史缺陷報告的相似性來調(diào)整相關(guān)源代碼文件的排名。這里利用VSM來計算缺陷報告之間的相似性。在VSM中,每個處理后的缺陷報告被作為一個n維向量,n是出現(xiàn)在缺陷報告中詞語的個數(shù),wi是n維向量中第i個詞語的權(quán)重。一個詞語t在文檔d中的權(quán)重可以用式(2)計算。
(2)
其中t表示詞語,d表示一個缺陷報告,e,是詞語t出現(xiàn)在d中的次數(shù),N是缺陷報告總數(shù),nt是含有詞語t的缺陷報告總數(shù),缺陷報告之間的相似性得余弦式(3)。
(3)
(4) 最終缺陷定位計算
對StructScore和SimiScore進行加權(quán)組合,得出一個源代碼文件總分數(shù)如式(4)。
FinalScore=(1-k)×StructScore+k×SimiScore
(4)
其中k是權(quán)重參數(shù),它的范圍在0~1之間,參數(shù)k根據(jù)多次實驗,選取最優(yōu)值。源代碼文件按照FinalScore分數(shù),由高到底遞減排列,源代碼文件排的越高,越是有可能和缺陷報告相關(guān)性大。
本文在實驗過程中,使用NetBeans作為開發(fā)工具。為了研究使用代碼結(jié)構(gòu)化信息和歷史缺陷報告信息是否能提高缺陷定位的精確度,本文選取了Eclipse開源項目作為測試集,并且Eclipse的版本和BugLocator方法中Eclipse的版本相同,以便進行比較。Eclipse3.1數(shù)據(jù)集總共包含了3075個缺陷報告,為Eclipse項目數(shù)據(jù)集,如表2所示。
表2 Eclipse項目數(shù)據(jù)集
本文選取了一部分缺陷報告作為歷史缺陷報告,以便進行實驗。
本文用StructLocato表示本文的源代碼結(jié)構(gòu)化缺陷定位方法[8],用StructSimiLoactor表示源代碼結(jié)構(gòu)化和歷史缺陷報告相結(jié)合的方法。對于式(1)中a,b,c,d權(quán)重的取值,本文經(jīng)過一部分實驗,選取了其最優(yōu)取值a=0.6,b=0.2,c=0.1,d=0.1。由于本文和BugLocator[9]使用了相同的Eclipse數(shù)據(jù)集,因此可以和BugLocator做比較。經(jīng)過大量實驗后,本文獲得了源代碼文件的前N排名,并計算出了MAP和MRR的值。如表3、表4所示。表3、表4中BugLocator方法的數(shù)據(jù)來自于他們的論文中。表3顯示了使用BugLocator方法和本文的StructLocator方法的缺陷定位比較,由于沒有加入歷史缺陷報告相似性,所以k=0。實驗結(jié)果顯示StructLocator方法比BugLocator方法能定位更多缺陷。例如,對于Eclipse,使用StructLocator方法返回的相關(guān)源代碼文件位于Topl的缺陷報告數(shù)目占總數(shù)的29.4%,而使用BugLocator方法定位到的缺陷報告僅僅只有24.4%,Top5和Top10也有類似的趨勢,StructLocator方法的MAP和MRR數(shù)值(MAP=0.29,MRR=0.40)要高于BugLocator的MAP和MRR(MAP=0.26,MRR=0.35),表明在Eclipse中StructLoactor方法的缺陷源文件的整體排名比BugLocator的高。
表3 沒有使用歷史缺陷報告下的實驗對比
表4顯示了使用BugLocator方法和本文的StructSimiLoactor方法的缺陷定位比較,經(jīng)測試比較,本文選取k權(quán)重因子為k=0.2。對于Eclipse的測試結(jié)果:
1) 在Topl中,使用StructSimiLoactor方法定位的缺陷報告占總數(shù)的32.7%而使用BugLocator方法定位的缺陷報告只占29.1%
2) 在Top5中,使用StructSimiLoactor方法定位的缺陷報告占56.0%,而使用BugLocator方法定位的缺陷報告只占53.8%}
3) 在Top10中,使用StructSimiLoactor方法定位的缺陷報告占65.3%,而使用BugLocator方法定位的缺陷報告只占62.6%
4) StructSimiLoactor方法的MAP和MRR數(shù)值分別是MAP=0.32}MRR=0.43而BugLocator的MAP和MRR數(shù)值分別是MAP=0.30}MRR=0.410
以上數(shù)據(jù)表明在Eclipse中StructSimiLoactor方法的缺陷源文件的整體排名比BugLocator的高。
表4 StructSimiLoactor和BugLocator的實驗對比
本文也同BugScout做了比較[10],如圖2所示。
圖2 在Eclipse中不同的缺陷定位方法對比
Nguyen等人使用了Eclipse數(shù)據(jù)集作為他們的實驗項目的一部分來評測BugScout,由于本文的Eclipse數(shù)據(jù)集和BugScout中Eclipse的版本不同,本文只列出了BugScout在Topl、Top5、Top10的概率。從圖2中可以看出:
1) 在Topl的位置,3個方法的缺陷定位概率大小比較是:
StructSimiLoactor>Buglocator>BugScout。
2) 在Top5和Top10的位置也有1)中類似的趨勢。
以上數(shù)據(jù)表明,StructSimiLoactor比Buglocator和BugScout表現(xiàn)出色。
本文提出了使用源代碼結(jié)構(gòu)化信息(如類名、方法名、變量名、注釋等)來提高缺陷定位的方法,本文將源代碼文件結(jié)構(gòu)的不同部分分別與缺陷報告進行匹配,對每一部分賦予不同的權(quán)值,然后進行加權(quán)求和,獲得源代碼結(jié)構(gòu)化的缺陷定位。為了更好的提高缺陷定位的精度,本文還充分利用了歷史缺陷報告信息。對歷史缺陷報告和新缺陷報告進行VSM相似性計算,將每個源代碼關(guān)聯(lián)的所有歷史缺陷報告分別與新缺陷報告進行相似性計算,將相似性計算的最大值作為這個源代碼文件的利用歷史缺陷報告的缺陷定位分數(shù)。將源代碼結(jié)構(gòu)化的缺陷定位和利用歷史缺陷報告的缺陷定位分別賦予不同的權(quán)值,進行加權(quán)組合,獲得最終的缺陷定位排名。最后對于所有的源文件,排名最高的文件嫌疑度最大。
[1] National Institute of Standards and Technology(NIST). Software Errors Cost U. S. Economy $59. 5 Billion Annually[R], June 28, 2002.
[2] 梁成才, 章代雨, 林海靜. 軟件缺陷的綜合研究 [J]. 計算機工程, 2006, 32(19):88-90.
[3] 古可, 劉超, 金茂忠, 等. C++代碼缺陷自動檢測工具的研究與實現(xiàn)[J]. 計算機應用研究, 2009, 26(5):1628-1631.
[4] 丁暉, 陳林, 錢巨, 等.一種基于信息量的缺陷定位方法[J]. 軟件學報, 2013, 24(7):1484-1494.
[5] 趙磊, 王麗娜, 高東明,等. 基于關(guān)聯(lián)挖掘的軟件錯誤定位方法[J]. 計算機學報, 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:一個易擴展的靜態(tài)代碼缺陷分析服務[J]. 軟件學報, 2012, 39(1):14-17
[8] 陳翔, 鞠小林, 文萬志, 等. 基于程序頻譜的動態(tài)缺陷定位方法研究[J]. 軟件學報, 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-),女,陜西周至人,碩士,講師,研究方向:計算機技術(shù)。 劉丹丹(1983-),女,河南焦作人,碩士,助理研究員,研究方向:計算機軟件設計。
1007-757X(2017)09-0047-03