李政亮 ,陳 翔,2 ,蔣智威 ,顧 慶
1(計算機軟件新技術國家重點實驗室(南京大學),江蘇 南京 210023)
2(南通大學 信息科學技術學院,江蘇 南通 226019)
在軟件開發過程中,軟件缺陷(software bug)難以避免.對需求理解的偏差、不合理的軟件開發過程、抑或開發人員的疏忽,均有可能在軟件項目內引入軟件缺陷.這些含有缺陷的軟件產品在部署后,可能會產生無法預測的行為或結果,甚至會對人們的生產和生活方式產生重大影響.當檢測到軟件內存在缺陷時,開發人員需要借助軟件調試定位并修復缺陷.傳統的軟件調試方法主要借助手工調試,在可疑代碼處設置程序斷點,隨后重復執行失敗的測試用例,并觀察程序斷點處的變量取值.不斷縮小可疑代碼的搜索范圍,直至定位到缺陷代碼.這種方法完全通過人工的方式完成,存在缺陷定位代價高、對缺陷報告信息利用不充分、費時費力等問題.因此,研究人員針對自動化軟件缺陷定位方法展開了深入研究,試圖在減輕開發人員負擔的同時,提高缺陷定位的效率與精度.
已有的缺陷定位方法按照是否需要執行測試用例,可分為兩類:動態缺陷定位方法和靜態缺陷定位方法[1].其中:動態缺陷定位方法通過搜集測試用例的執行行為和運行結果,重點對被測程序的內在結構進行分析,以確定缺陷語句在被測程序內的可能位置;靜態缺陷定位方法通過分析缺陷報告和程序模塊的文本內容并提取特征,基于特定模型確定可疑的程序模塊,并將其推薦給開發人員以輔助定位.動態缺陷定位方法基于測試用例的覆蓋信息定位缺陷,通常可獲得比靜態缺陷定位方法更好的性能[2].然而在軟件維護階段,開發人員有時并不能獲得足夠的測試用例[3],僅能搜集到缺陷報告的信息.靜態缺陷定位方法由于不需要搜集測試用例的執行信息,不會受到程序規模和編程語言等因素的影響,具有缺陷定位代價低和方法可擴展性強等特點,也頗受關注.其中,基于信息檢索的缺陷定位(information retrieval-based bug localization,簡稱IRBL)是目前靜態缺陷定位研究中的熱點,也是本綜述重點關注的研究問題.
IRBL 可視為概念定位(concern localization)[4]或特征定位(feature localization)[5]的一個特例.當需要定位的概念或特征都為缺陷時,概念定位或特征定位又被稱為缺陷定位.IRBL 輸入為一個缺陷報告,輸出為所有與該缺陷報告所述缺陷相關的程序模塊.該問題在研究時面臨缺陷報告和程序模塊詞匯不匹配和表示方式差異較大等問題,大部分研究人員從文本挖掘角度設計解決方案.為了對該研究問題進行系統的分析、總結和比較,我們首先在IEEE Explore、ACM Digital Library、Elsevier、Springer、CNKI 等學術論文數據庫中進行檢索,檢索時采用的英文關鍵詞包括bug localization、fault localization、information retrieval、bug localisation 等;然后,通過人工審查的方式移除掉與綜述主題無關的論文,并通過查閱相關論文的參考文獻和相關研究人員發表的論文列表來進一步識別出遺漏的論文;最終,我們篩選出與該研究問題直接相關的高質量論文共87 篇(截止到2019 年12 月).
我們首先對每年發表的相關論文的累計總數進行統計,結果如圖1 所示.不難看出,每年發表的論文數整體上呈上升趨勢.在2013 年之前,每年發表的論文數較少(介于0 至4 篇).但在2013 年之后,隨著公開的數據集和共享的實驗代碼的不斷增多,針對IRBL 方法的研究逐漸成為靜態軟件缺陷定位領域內的一個主流研究方向.在最近3 年,每年發表的論文總數平均可以達到13 篇以上.

Fig.1 Statistics of annual cumulative number of papers on IRBL圖1 IRBL 每年累計發表論文數的統計
隨后,我們基于論文發表源對相關論文進行分類,并按照論文數從大到小進行排序,最終結果如表1 所示(該表僅列出CCF 推薦列表中論文數大于1 的會議和期刊),其中,在軟件工程領域權威期刊或會議上發表的論文數總結如下:ICSE 會議(5 篇)、ESEC/FSE 會議(4 篇)、ISSTA 會議(3 篇)、ISSRE 會議(2 篇)、TSE 期刊(5 篇)等.基于已搜索到的相關論文,我們對IRBL 方法的已有研究工作進行了系統總結,并提出一個研究框架,從3 個影響因素出發,對不同類型的方法進行系統的分析和比較,同時對常用的性能評測指標和評測數據集進行歸納.

Table 1 Statistics of the publication sources of papers on IRBL表1 針對IRBL 論文的發表源統計
本文第1 節總結IRBL 方法的研究框架,并識別出3 個重要的影響因素(數據源、檢索模型和場景應用).第2 節~第4 節分別對這3 個影響因素進行詳細的分析與總結.第5 節介紹常用的性能評測指標.第6 節介紹常用的評測數據集.最后總結全文并對未來可能值得關注的研究問題進行展望.
IRBL 方法針對一個缺陷報告,嘗試定位到可能包含缺陷的程序模塊(其模塊粒度根據實際定位需求可以設置為文件、類或方法等).其輸入為缺陷報告和所有候選程序模塊,通過建立程序模塊語料庫、建立索引、構建查詢、檢索和排序,推薦給開發人員一個有序列表(在該有序列表內,程序模塊按照含有缺陷的可能性從高到低進行排序).
在缺陷定位過程中,一個典型的缺陷報告如圖2(a)所示,該缺陷報告來自軟件項目AspectJ.缺陷報告一般包含標題(title)、描述(description)、評論(comment)、產品(product)、組件(component)、版本號(version)和報告提交時間等信息,其對應的缺陷程序模塊是LazyTransfer.java 和RTFTransfer.java 文件(如圖2(b)所示).缺陷報告中的標題總結缺陷問題,描述給出缺陷的癥狀以及觸發缺陷的行為等,評論則包含評論者的反饋信息等.這些文本通常涉及缺陷代碼中的詞或片段,提供缺陷定位所需的大部分信息.然而總存在一些低質量的缺陷報告,其描述內容不清晰,甚至不包含評論內容.對于圖 2(a)中缺陷報告而言,在評論中涉及到了缺陷程序模塊的類名RTFTransfer,這對缺陷的定位和驗證起重要作用,在沒有評論時,將無法提供足夠的信息來進行缺陷定位,此時,這類缺陷報告需要使用其他額外信息來定位缺陷程序模塊.在基于各類缺陷報告進行缺陷定位時,其典型研究框架如圖3 所示.
圖3 的上半部分總結IRBL 的過程,該過程主要包括兩個階段:模型構建階段和模型應用階段.具體來說,模型構建階段包括兩個步驟.
(1) 挖掘缺陷跟蹤系統、版本控制系統、API 文檔等數據源,從中搜集缺陷報告、程序模塊和提交日志等信息,建立缺陷報告與程序模塊的關聯,構建出缺陷定位數據集;同時,IRBL 的輸入也由所搜集的數據源信息決定.
(2) 設計出衡量缺陷報告與程序模塊相關度的特征,分析程序模塊含有缺陷的概率,借助這些特征構建出缺陷定位模型,即IRBL 模型.

Fig.2 A bug report and a corresponding buggy program module in AspectJ圖2 AspecJ 項目中的某個缺陷報告和對應的缺陷程序模塊

Fig.3 Research framework of IRBL圖3 IRBL 的研究框架
在模型應用階段,當處理一個新的缺陷報告時,基于前一階段流程提取特征,并應用訓練好的缺陷定位模型完成對該缺陷報告的定位,將缺陷程序模塊的有序列表推薦給開發人員.
根據缺陷定位應用場景的不同需求,其缺陷定位粒度和結果不同,需要的輸入信息、特征提取方式和檢索過程都會稍有不同,最后輸出不同的有序列表.
通過分析上述軟件缺陷定位過程,我們識別出影響缺陷定位性能的3 個重要因素(如圖3 的下半部分所示).
(1) 數據源.對開發人員而言,除可獲得缺陷報告信息和程序模塊代碼之外,還可挖掘出軟件的版本歷史信息和程序模塊的變更信息等,IRBL 方法的輸入決定了在缺陷定位過程中所能包含信息的上限,從更多信息角度構建出與缺陷報告所述軟件缺陷存在強相關性的特征,這是構建高質量缺陷定位模型的關鍵.
(2) 檢索模型.IRBL 檢索模型主要基于詞法和語義角度進行檢索,因此,本文將已有的檢索模型方法分為兩類:基于文本相似度的方法和基于語義相似度的方法.
(3) 場景應用.針對不同場景,不同開發人員的定位需求不同,因此對缺陷定位粒度和返回結果的要求也各不相同.本文將缺陷定位的應用場景按其定位粒度劃分為4 類:基于文件的缺陷定位、基于函數的缺陷定位、基于語句的缺陷定位和基于代碼變更(code change)的缺陷定位.
如何從缺陷跟蹤系統和版本控制系統中挖掘出與缺陷報告所述軟件缺陷存在強相關性的信息,是構建高質量缺陷定位模型的關鍵.早期的研究工作主要集中于分析缺陷報告的內容,重點關注缺陷報告的總結和描述內容,挖掘程序模塊與缺陷報告之間的相關性.但存在部分缺陷報告本身只包含少量信息的情況,導致缺陷定位性能降低.近些年來,許多研究工作開始集中于從其他信息源角度挖掘與缺陷程序模塊相關的信息,并設計出合適的特征,這些特征主要從缺陷報告與程序模塊的相關性以及程序模塊本身的缺陷概率兩個方面來衡量,不同的輸入信息也是圍繞這兩個方面進行考慮.本節將重點從這個角度對已有研究工作進行系統的總結,首先不同的數據源可劃分為3 類:(1) 缺陷報告和程序模塊;(2) 項目元數據;(3) 測試用例的執行信息.
從缺陷跟蹤系統中可挖掘出缺陷報告信息,從版本控制系統(例如Git、CSV 或SVN 等)中可挖掘出程序模塊代碼和項目元數據(即版本歷史信息和代碼變更信息等).測試用例的執行信息通過對項目運行多個測試用例生成并獲取.缺陷報告和程序模塊作為IRBL 的主體,是必不可少的.在已公開數據集中,大部分數據集僅提供缺陷報告和程序模塊代碼,項目元數據和測試用例的執行信息需額外獲取.
在IRBL 研究的早期階段,大部分研究工作僅通過分析缺陷報告和程序模塊代碼來定位可能包含缺陷的程序模塊.在以缺陷報告和程序模塊作為輸入時,如圖2 中所示,缺陷報告包含總結、描述、元數據(版本、平臺、操作系統、缺陷嚴重程度和匯報者)和評論,程序模塊包含注釋、標識符和字符串字面值等信息.大部分IRBL方法并不會使用全部的信息,通常被使用到的是缺陷報告中的總結和描述以及程序模塊中的標識符和注釋.對于缺陷報告和程序模塊的文本內容,首先要進行預處理.除此之外,會根據缺陷報告中是否包含特殊文本(如堆棧跟蹤(stack trace)以及文件名等)進行特殊處理.該小節首先介紹預處理過程,然后從缺陷報告與程序模塊相關性以及程序模塊缺陷概率這兩個角度對已有方法進行總結.
2.1.1 預處理過程
原始的缺陷報告和程序模塊文本具有很多噪音詞匯及數據.早期的IRBL 方法就已經開始針對缺陷報告和程序模塊的文本執行數據預處理,以達到減少噪音和提高缺陷定位性能的目的.數據預處理過程主要包括文本標準化(text normalization)、停用詞(stopword)移除以及詞干提取(stemming)這3 步.
· 文本標準化:首先從文檔中移除特殊字符和標點符號等單詞,隨后將文檔切分成不連續的單詞,對于源代碼中的標識符,還需依據駝峰式分割法(camel case splitting)來進一步切分為更小的單詞.例如,標識符“processFile”可以被切分為單詞“process”和“file”.
· 停用詞移除:針對標準化的文檔,借助英文中的常用停用詞進行移除.停用詞是指在各個文檔中頻繁出現,但在區分不同文檔時作用極小的單詞,如“a”“on”等單詞.對程序模塊而言,需移除程序語言相關的停用詞,如“int”“private”等.
· 詞干提取:將單詞轉換成對應的詞干形式.例如,單詞“localized”“localization”“localize”和“locally”都可還原為詞干“local”.
許多研究人員同時采用這3 步預處理過程,這些過程對減小缺陷報告和程序模塊的詞匯差異性有顯著幫助.Thomas 等人[6]和Tantithamthavorn 等人[7]在探索分類器配置對缺陷定位性能影響時,對3 步預處理過程進行排列組合,并最終形成8 種預處理方式.實驗結果表明:對所有的實驗項目和檢索模型而言,同時使用3 步預處理過程的檢索結果相較于使用其他排列組合方式的結果始終是最優的.Hill 等人[8]則對詞干提取在缺陷定位(或概念定位)中的影響進行了研究,比較了5 種詞干提取器(stemmer):Porter、Snowball、Kstem、Paice 和Mstem.結果表明:不同的詞干提取方法對長缺陷報告的影響較小,對短缺陷報告的影響則較大.其原因為:短缺陷報告的文本組織更加接近自然語言,而長缺陷報告的文本則通常會包含代碼片段.
2.1.2 缺陷報告與程序模塊相關性
缺陷報告與程序模塊的相關性度量主要從文本信息、堆棧跟蹤、相似缺陷報告這3 個角度出發.
(1) 文本信息
這類信息的常見輸入是缺陷報告的總結和描述以及程序模塊的文本內容,可采用文本檢索方法直接計算出缺陷報告和程序模塊之間的相關性,也可基于語義模型計算出缺陷報告和程序模塊的相關性.
早期,Lukins 等人[9,10]從指定粒度的程序模塊(可以是包、類或方法等)提取代碼中的注釋和標識符以形成文檔集,缺陷報告僅使用描述部分的內容,通過LDA(latent dirichlet allocation)檢索模型查詢與缺陷報告相關聯的程序模塊.Nguyen 等人[11]則使用缺陷報告的總結和描述內容作為查詢,提取程序模塊的注釋和標識符形成對應的文檔集.他們改進了主題模型LDA,分別對缺陷報告和程序模塊應用主題模型,并且訓練集中缺陷報告的主題還受其對應的缺陷程序模塊的主題分布參數影響,即它們共享相似的主題分布參數,訓練好模型后,將其應用到新的缺陷報告上.Lal 等人[12]則考慮從字符級別的n-gram 模型出發進行信息檢索,不局限于單詞.從字符角度考慮,具有可匹配拼寫錯誤的單詞、可匹配縮寫詞等優點,因此具有更高的魯棒性.該方法使用的輸入為缺陷報告的標題和描述以及程序模塊的文件名和文件路徑名,兩兩組合計算相似度,n-gram 模型的字符設置長度從3增長到10.結果表明:字符級別的n-gram 方法是有效的,且描述與文件名的組合相較于其他3 個組合具有更高的預測性能.Zhang 等人[13]發現,缺陷報告中的元數據(組件和版本信息等)被多數IRBL 方法忽略,因此提出一個修正的主題模型L2SS+,并考慮了缺陷報告元數據.該方法假設缺陷報告的不同元數據項有不同的主題分布,將不同的主題分布累加起來作為缺陷報告的主題分布,然后計算缺陷報告和程序模塊的關聯度.實驗結果表明,使用元數據信息能有效提高缺陷定位性能.Khatiwada 等人[14]從信息理論的角度分析和建立缺陷報告和程序模塊之間的關聯,通過詞與詞之間的聯系捕捉文檔間的語義信息.他們采用點間互信息 PMI(pointwise mutual information)和規范化google 距離NGD(normalized google distance).其中,PMI 度量兩個詞間的信息重疊或統計依賴程度,NGD 基于信息距離和Kolmogorov 復雜度來衡量詞之間的語義相關度.隨后,該方法基于PMI 或NGD將詞之間的關聯拓展到文檔之間的關聯.實驗結果表明,該方法要優于VSM 和LSI 等通用文本模型.
使用文本信息來進行缺陷定位,依賴于缺陷報告和程序模塊之間的共享詞匯.Moreno 等人[15]對此進行了分析,他們發現:缺陷報告和軟件系統中的大部分類文件都共享部分詞匯,平均而言,與打補丁的類(即缺陷類)有更多共享詞.缺陷類各部位按照與缺陷報告共享詞的數量從大到小排序的結果為:注釋(26.98%)、函數調用(20.28%)和類型名(12.69%)等,而各部位共享詞的比率從大到小排序的結果為:類名(53.57%)、字符串面值(21.40%)和類型名(20.69%)等.他們還發現,用共享詞的數量定義相關性有時比一些文本檢索方法定位更準確.可以看出:在這類基于文本信息進行檢索的IRBL 方法中,缺陷報告的質量會直接影響到缺陷定位的性能.
(2) 相似缺陷報告
在缺陷跟蹤系統中,存在重復或相似的缺陷報告[16].有研究人員假設:如果兩個缺陷報告的文本相似度很高,則這兩個缺陷報告很可能對應相同的缺陷程序模塊.因此,可從已修復的缺陷報告中搜索出與當前缺陷報告相似的缺陷報告.相似缺陷報告評分作為增強缺陷報告與缺陷程序模塊相關性的評分,被多個方法使用.
Davies 等人[17]基于缺陷報告間的相似度,增強缺陷定位缺陷性能.他們為程序模塊中的每個函數訓練一個二分類決策樹,其輸入是基于缺陷報告描述生成的詞向量,類標簽表示缺陷報告是否與函數相關.當新的缺陷報告被提交后,每個分類器按順序來預測標簽.Zhou 等人[18]基于相似缺陷報告的假設,對相似缺陷報告的缺陷程序模塊給一個基于缺陷報告間相似度的評分,并且考慮到程序模塊的代碼長度問題,采用了修正的VSM(vector space model),相較于直接利用VSM 和LDA 等文本檢索模型的計算方法,缺陷定位性能有了顯著提升.
(3) 堆棧跟蹤
缺陷報告的質量有高有低,有時缺陷報告中會包含程序執行失敗后的堆棧跟蹤信息.當缺陷報告包含堆棧跟蹤信息時,開發人員首先檢查堆棧跟蹤中涉及到的程序模塊來進行缺陷定位.Schroter 等人[19]發現,幾乎60%的帶堆棧跟蹤的缺陷報告都可以通過修改堆棧跟蹤記錄中的函數來修復.其中,大概有40%的缺陷函數可以在堆棧跟蹤的第1 幀中發現,90%的缺陷函數可以在前10 幀中發現.通過使用堆棧跟蹤這一額外的輸入信息,可以有效提高缺陷定位的性能,這類信息通常也被用來作為計算缺陷報告和程序模塊相關性的補充.

其中,shortestPath(d,cj)表示程序模塊d與程序模塊cj的最短距離,dist(stackTrace,cj)衡量程序模塊cj與堆棧跟蹤中所有程序模塊的最短距離,ScoreST(ri,cj)衡量缺陷報告ri中的堆棧跟蹤與程序模塊cj的相關性評分.
Wong 等人[21]采取了和文獻[20]類似的操作,將文本相似度和堆棧跟蹤相似度相結合.他們發現了當前缺陷定位方法尚未解決的兩個問題:大文件的噪音問題以及堆棧跟蹤信息未使用的問題.他們針對性地將程序模塊代碼進行等長分割,比較缺陷報告和分割后的代碼文本相似度以過濾噪音;而對堆棧跟蹤信息的利用,則是通過對堆棧跟蹤中出現的所有程序模塊賦予一個缺陷模塊增強評分,其計算公式如下.

其中,rankcj表示程序模塊cj在堆棧跟蹤中的排名,Dtrace表示堆棧跟蹤中的程序模塊形成的集合,Dimport表示堆棧跟蹤中的程序模塊所調用的程序模塊形成的集合.該方法對堆棧跟蹤中的程序模塊以及其程序模塊所調用的模塊依據其排名給出增強評分.
2.1.3 程序模塊缺陷概率
程序模塊自身因其代碼規模或復雜度不同,其內部含有缺陷的概率也不同[22].有研究人員考慮從缺陷程序模塊特性出發,從程序模塊中挖掘出更多信息.
(1) 程序模塊調用關系
Ye 等人[23]認為,復雜的代碼比簡單代碼更容易引入缺陷.他們從句法特征的角度衡量代碼的復雜度:(1) 程序模塊復雜度隨著它使用的類的數目的增多而增加;(2) 程序模塊復雜度不僅依賴于它依賴文件的數目,也取決于每個依賴文件的復雜度;(3) 程序模塊感知復雜度隨使用次數增多而降低.基于這些觀察,Ye 等人基于程序模塊調用關系構建一個程序模塊依賴圖,使用PageRank 和HITS(hyperlink-induced topic search)等基于連接查找關鍵信息節點的算法分析復雜缺陷程序模塊,以定位缺陷.Zhou 等人[24]從詞性和程序模塊調用的角度來增強缺陷定位的性能.他們分析缺陷報告詞匯的詞性,提高名詞的權重;同時,考慮缺陷報告中的類名,將類名對應的文件定義為命中文件,選擇相似度評分最高的命中文件,提高其調用文件的評分.Chen 等人[25]沒有直接利用程序模塊間的調用關系,他們基于缺陷報告將程序模塊建模成一個社交網絡,進行隱連接分析.該方法基于假設:如果一個缺陷報告與兩個程序模塊相關,則這兩個程序模塊存在一個共引用關系(co-cited relationship),可構建隱式雙向連接.通過分析所有歷史缺陷報告可以構建出社交網絡圖,該方法基于改進的PageRank 算法可估算每個程序模塊的評分.當遇到一個新的缺陷報告時,計算缺陷報告與歷史缺陷報告的相似度,由其對應的缺陷程序模塊評分得出.
(2) 代碼異味(code smell)
教學改革研究項目管理系統的實現 系統采用Java語言,以J2EE技術為基礎,采用目前應用較為廣泛的SSH Web框架,運用Struts+Spring+Hibernate技術搭建表示層、業務邏輯層、數據持久層和域模塊層,建立結構清晰、可復用性好、維護方便的Web應用程序。
代碼異味指那些在源代碼中很可能引發深層問題的特征,如出現重復代碼、過長函數、過大的類、過長參數列表等情況.代碼異味檢測將源代碼作為輸入,生成包含代碼異味的程序模塊列表及其異味類型或嚴重程度.
Takahashi 等人[26]對使用代碼異味來提高缺陷定位性能進行了初步研究,他們將缺陷報告和程序模塊的文本相似度以及代碼異味嚴重程度進行線性擬合來定位缺陷.實驗結果表明,代碼異味在函數和類級別定位上都能顯著提高缺陷定位的性能.
除了從缺陷報告和程序模塊角度進行挖掘,開發人員可從版本控制系統中獲取軟件代碼的變更歷史信息,這類信息主要輸入包括從Git,CVS,SVN 等版本控制系統中抽取的項目元數據(metadata).其中,項目元數據指從版本控制系統中可直接獲取的項目文件修改信息、歷史變更記錄或提交日志(commit log)等.通過分析日志等信息,研究人員可以獲得程序模塊的歷史修改次數、程序模塊的缺陷修復次數、程序模塊上一次缺陷修復時間、一次缺陷修復提交中被修改的所有文件等信息.經研究人員觀察發現:如果一個文件在最近的版本中被修改或實現某個新增功能,它有很大的概率會引入缺陷.這類信息從程序模塊缺陷概率的角度提供額外信息.
Sisman 等人[27]首次使用版本信息來估計程序模塊的先驗缺陷概率,用于缺陷定位.他們基于缺陷預測的已有研究工作,認為文件修改歷史和文件缺陷歷史是比較好的文件潛在缺陷預測特征.因此,他們定義了修改歷史先驗(modification history based prior,簡稱MHbP)和缺陷歷史先驗(defect history based prior,簡稱DHbP)兩個指標,其計算公式如下.

其中,
·Ck表示第k次變更后的程序模塊集合.
·Sk表示第k次變更修改的程序模塊集合.
· 函數Im(f,si)指文件f是否在第si次變更中被修改:被修改則為1,否則為0.
·PMHbP(f|Ck,Sk)統計的是文件f的修改總次數占所有文件修改次數的比率.
·PDHbP(f|Ck,Sk)與之類似,統計的是該文件的缺陷修復次數占所有文件缺陷修復次數的比率.
Tantithamthavorn 等人[28]使用聯合變更歷史來增強BugLocator 方法[18]的缺陷定位性能.其中,聯合變更是指在開發人員的一次代碼提交中存在多個程序模塊被修改變更的現象.他們利用一個假設:如果一個缺陷模塊被修復,那些與缺陷模塊同時被修改的程序模塊也需要被修復.該方法為所有程序模塊創建一個交互矩陣,記錄之前程序模塊被一起修改的次數,在將交互矩陣標準化后,選取與BugLocator 排序結果中前k個程序模塊關聯的并且大于某個閾值的程序模塊作為缺陷程序模塊,同時推薦給開發人員.
Wang 等人[29]同樣利用缺陷預測領域的研究成果,對程序模塊依據與之相關的缺陷修復提交的個數進行排序(即程序模塊缺陷修復歷史).經驗表明:過早的缺陷修復提交因時間原因對最新的缺陷定位影響不大,甚至會降低缺陷定位性能.他們因此修改Google 開發人員提出的缺陷預測算法,搜集包含“fix”或“bug”的提交,并限制這些提交在缺陷報告提交時間的k天以內;隨后賦予與提交相關的程序模塊一個懷疑率評分,其計算公式如下.

其中,FS為缺陷相關提交的集合,tc′為提交c′和輸入缺陷報告提交時間的相隔天數.
開發人員可執行多個測試用例,分析測試用例的覆蓋信息和執行結果,搜集頻譜(spectrum)信息和切片(slicing)信息等.其中:頻譜信息描述失敗測試用例和成功測試用例執行的覆蓋比例,可計算每個執行類或函數的可疑評分;程序切片描述影響某個程序點狀態的所有類或函數,在測試用例失敗時,只有對失敗點有影響的表達式可能包含缺陷.這些測試用例的執行信息常用于動態缺陷定位[30],可衡量程序模塊的缺陷概率.
Le 等人[31]利用頻譜信息和文本信息,提出一種多模態方法,并定義了3 類特征:基于本文的特征、基于頻譜的特征和基于可疑詞的特征.具體來說:文本特征考慮缺陷報告和程序模塊的文本相似度,頻譜特征僅考慮使用基于頻譜的缺陷定位技術來計算相關度,基于可疑詞的特征則根據單詞出現在執行失敗的函數中的次數占單詞出現在所有函數中次數的比例計算.這3 類特征通過一個線性整合器進行擬合,并采用邏輯回歸進行優化.Hoang 等人[32]在Le 等人[31]工作的基礎上提出了基于網絡聚類的多模態缺陷定位方法,采用聯合優化的方式.該方法同時考慮上述3 類特征以及缺陷報告之間和程序模塊之間構建的關系圖,損失函數由相似缺報告和相似程序模塊的聚類損失、缺陷定位的誤差損失組成.
Dao 等人[33]則研究了頻譜信息、切片信息和覆蓋信息對IRBL 方法的影響,他們比較了4 類結合方式:覆蓋信息與IRBL 相結合、切片信息與IRBL 相結合、覆蓋信息和頻譜信息與IRBL 相結合、切片信息和頻譜信息與IRBL 相結合.覆蓋信息和切片信息可用來優化搜索空間,過濾掉失敗測試用例沒有執行到的程序實體;頻譜信息可用來計算每個實體的懷疑率評分,并對排序進行調整.實驗結果表明:通過覆蓋信息和切片信息來優化排序列表,能有效提高缺陷定位準確率,頻譜信息能更進一步提高函數級別的缺陷定位性能.
表2 對IRBL 方法使用的數據源信息進行了統計,根據該表我們發現:缺陷報告和程序模塊作為IRBL 方法的必要輸入,對每個IRBL 方法都不可或缺,因此涉及的論文數最多.其他數據源涉及的論文數則明顯偏少.研究人員主要從程序模塊和缺陷報告的相關性考慮,挖掘多種信息,僅有少數方法考慮從程序模塊缺陷概率的角度出發.在缺陷報告和程序模塊相關性度量中,從文獻[18,21]的參數設置比例我們發現:對IRBL 方法而言,基于文本信息計算的相關度的權重顯著大于基于相似缺陷報告和堆棧跟蹤計算的相關度的權重,基于文本信息計算的相關度起決定作用,后兩者起著優化作用.將缺陷報告與程序模塊相關性和程序模塊缺陷概率相比時,缺陷報告與程序模塊相關性起主要作用,程序模塊缺陷概率起次要作用[34].為此,有許多研究人員直接考慮從缺陷報告和程序模塊的文本內容出發,關注于提升缺陷報告和缺陷程序模塊的關聯度,著重解決缺陷報告和程序模塊的詞匯不匹配問題.

Table 2 Statistics of data sources表2 數據源統計
為了解決缺陷報告和缺陷程序模塊的不匹配問題,IRBL 檢索模型從基于詞法的模型發展到基于語義的模型,參數優化方式從簡單的啟發式方法發展到基于學習的優化方法.IRBL 檢索模型發展依時間層次遞進,可分為基于文本相似度的方法和基于語義相似度的方法,下面將依次介紹這些方法.
3.1.1 基于通用檢索模型的方法
這類方法主要依賴缺陷報告和程序模塊間詞的相似度,將缺陷報告視為查詢,將程序模塊視為語料庫,進行文本檢索.經典的文本檢索模型都可應用于IRBL.目前,在IRBL 中被使用的經典模型有向量空間模型VSM、主題模型和概率檢索模型等.
(1) 向量空間模型(VSM)
VSM 基于詞袋模型,將缺陷報告和程序模塊表示為對應的向量,根據TF(term frequency)和IDF(inverse document frequency)計算方式的不同可有多個變種,隨后通過計算向量間的余弦相似度來衡量缺陷報告和程序模塊間的相似性.
Wang 等人[35]根據5 種TF 計算方式和3 種IDF 計算方式形成15 種VSM 變種,他們將15 種VSM 相似度評分通過線性相加進行組合建模,隨后使用遺傳算法來自動優化參數取值.實驗結果表明:通過組合優化的方式,該方法的缺陷定位性能要顯著優于標準的VSM 模型.Gore 等人[36]將N-Gram 模型與VSM 相結合,提出了混合檢索模型.常用的VSM 模型只考慮單個詞,詞之間互相獨立(即詞袋模型),詞組信息缺失.該方法同時采用一元模型(unigram model)和二元模型(bigram model),并分別基于rVSM[18]計算兩種相似度,最后加權求和.與傳統方法相比,該混合模型缺陷定位性能有顯著提升.
(2) 主題模型
IRBL 中使用的主題模型有潛在語義分析(latent semantic analysis,簡稱LSA 或latent semantic index,簡稱LSI)和隱含狄利克雷分布LDA:LSA 采用奇異值分解(singular value decomposition)將VSM 模型所表示的向量降維,形成一個降維后的K維向量表示,隨后通過計算余弦相似度來衡量缺陷報告和程序模塊間的相似性;LDA假設缺陷報告和程序模塊都是由某些主題生成,因此缺陷報告和程序模塊的相似度可基于主題分布來計算.
Lukins 等人[9,10]提出了基于LDA 的缺陷定位方法,并與LSI 模型進行比較,結果表明,LDA 模型的定位性能更好.Wang 等人[37]發現:(1) 有監督模型能有效利用現存的修復歷史信息;(2) 缺陷報告中某些單詞多次出現在相關缺陷模塊中(即詞共現現象);(3) 大的程序模塊傾向于含有更多的缺陷(即長文件現象).基于上述發現,他們提出一種有監督主題模型STMLOCATOR.該方法改進了有監督主題模型LLDA[38]方法,對詞共現現象和長文件現象進行建模.單詞w可由缺陷報告和程序模塊中的共現詞或主題-詞分布生成,他們設置主題數為程序模塊的個數,引入一個非對稱的Dirichlet prior 來表示選擇不同主題的不同概率.當一個文件規模比較大的時候,其被選中的概率更高.
(3) 概率檢索模型
IRBL 中使用的概率模型包括SUM(smoothed unigram model)和BM25[39].
· SUM 將每個程序模塊和缺陷報告表示為一個|V|維的概率向量,可通過KL 散度計算出程序模塊和缺陷報告的分布差異,并以此作為相似度指標;也可用程序模塊和缺陷報告的生成概率表示,其中,分別是缺陷報告和程序模塊的向量表示.
· BM25 基于缺陷報告和程序模塊的生成概率衡量其相似性.
Saha 等人[40]提出了BLUiR 方法,將缺陷報告分成總結(summary)和描述這兩個部分,將程序模塊分成類名、函數名、變量名和注釋這4 個部分,基于已訓練的BM25 模型,將其表示為特征向量,然后分別計算缺陷報告和程序模塊各部分文本相似度,并累加作為最終的文本相似度評分.
(4) 模型比較
Rao 等人[41]首次分析了文本檢索模型對缺陷定位性能的影響,比較了VSM、LSA、LDA、SUM 和CBDM等5 種通用文本模型以及它們的組合,實驗通過缺陷報告的描述文本信息定位缺陷程序模塊.實證結果表明:與更復雜的模型(例如LDA、LSA、CBDM 等)相比,簡單的模型(例如SUM、VSM)在基于檢索的缺陷定位上更加有效.
Wang 等人[4]同樣分析了文本檢索模型對概念定位的影響,他們比較了VSM、SUM、NMF、LSI、pLSI 和LDA 等多個檢索模型,得到了與Rao 等人相似的實驗結論,即,簡單的IR 模型(例如VSM、SUM)比復雜的模型(例如LDA,LSI 等)定位效果更好.
Thomas 等人[6]探索了不同分類器及其組合對缺陷定位性能的影響,他們比較了VSM、LSI 和LDA 等3 種模型,將缺陷報告表示分為僅考慮標題、僅考慮描述和同時考慮標題與描述這3 類,將程序模塊表示分為僅考慮標識符、僅考慮注釋、同時考慮標識符和注釋以及與程序模塊相關的歷史缺陷報告集合等6 類,預處理過程也將分割、詞干提取、停止詞移除這3 個過程通過排列組合方式形成8 種,然后分別對VSM 的詞權重與相似度計算規則、LSI 的詞權重、主題數與相似度計算規則、LDA 的迭代數、主題數等參數設置進行多種設置,最后形成3 172 種基于IR 的分類器,用于缺陷定位.實驗結果表明:基于IR 的分類器其配置對缺陷定位性能有很大影響,其中最好的IRBL 分類器配置是使用缺陷報告和程序模塊的全部內容,執行3 步預處理過程,采用基于TF-IDF 的VSM 模型并計算余弦相似度.隨后,Thomas 等人還對分類器組合進行探討,他們將分類器基于缺陷報告和程序模塊的表示方式分為4 個分類器子空間,保證每類分類器分類錯誤方式盡可能不同,同時采用兩個基本策略:在每個子空間中選取最好的分類器或隨機選擇分類器,將選擇的分類器采用線性擬合的方式進行定位.實驗結果表明,分類器組合在幾乎所有情況下都能夠提高缺陷定位性能.
Tantithamthavorn 等人[7]基于Thomas 等人[6]的工作,著重分析了分類器的配置對函數級別缺陷定位的性能和成本(effort)的影響,成本指找到缺陷程序模塊所需檢查代碼行數的代價.他們采用相同的配置,比較了3 172個分類器.他們做出以下觀察:(1) 分類器配置的選擇對性能和成本影響較大,TopKRank 性能的影響介于0.44%~36%之間,需要的成本介于4395LOC~50000LOC 之間;(2) 給出相似TopKRank 性能的分類器,需要的成本也不同;(3) VSM 模型在函數級別缺陷定位獲得最好的TopKRank 性能和最少的成本代價;(4) 與程序模塊表示相關的配置對TopKRank 性能和成本代價的影響最大;(5) 在函數級別缺陷定位上最有效的配置同樣可用于文件級別缺陷定位上.
通過分析相關文獻,我們發現:在經典檢索模型中,VSM、SUM 等簡單IR 模型往往能表現更好的性能,VSM模型是所有經典模型中被使用次數最多的模型.IR 模型配置的選擇對缺陷定位性能影響較大,需要針對不同數據集做不同選擇.
3.1.2 優化方法
1) 基于輸入源拓展的方法
缺陷報告包含的自然語言與程序模塊包含的程序語言存在較大差異,因此將文本檢索模型應用于缺陷定位有時效果并不理想.研究人員嘗試基于領域知識提取特征,以提高檢索結果.這類方法基于領域知識(如將文件分解成函數、使用庫組件的API 描述、分析缺陷修復歷史和代碼變更歷史等),設計出合適的特征來更為合理地計算出缺陷報告與程序模塊之間的相似度.
Zhou 等人[18]發現:(1) 代碼規模大的文件,其含有缺陷的可能性更高;(2) 如果兩個缺陷報告的文本相似度很高,則這兩個缺陷報告很可能對應相同的缺陷模塊.他們據此提出了BugLocator 方法,在計算VSM 評分時將程序模塊的詞數加入考慮,用于修正VSM 評分;同時,從已修復的缺陷報告中搜索與當前缺陷報告相似的缺陷報告,給對應的缺陷程序模塊賦予一個評分.最終,基于VSM 評分和相似缺陷報告評分來定位缺陷.
Rahman 等人[42]進一步考慮了程序模塊代碼結構和其缺陷修復次數,將缺陷報告中疑似類名或方法名的文本識別出,并對這些類或包含這些方法的類賦予額外的優先因子β;同時,根據程序模塊缺陷修復次數對缺陷報告和程序模塊的相關度評分進行微調.最后,對相關度評分和優先因子β進行線性擬合.
Youm 等人[43]基于上述的文本信息、堆棧跟蹤信息、結構信息和代碼變更信息求得對應的評分StructVsmScore(r,c),SimiBugScore(r,c),StraceScore(r,c)以及從代碼變更歷史信息計算的評分CommScore(r,c,k),最后憑經驗對4 項缺陷報告和程序模塊評分進行加權.
Uneno 等人[44]提出了CombBL 模型,從4 個方面計算缺陷報告和程序模塊的相似度:基于word2vec 的相關度評分、基于BugLocator[18]方法計算的文本相似度評分、基于缺陷修復歷史的評分和基于組件域的評分.其中:基于word2vec 的相關度評分是將缺陷報告和程序模塊以其詞向量的均值作為表示向量,計算余弦相似度;基于組件域的評分是以預處理后的缺陷報告中的每個詞對程序模塊全路徑名進行松散搜索,成功則對應評分加1.最后對4 種評分進行線性擬合,并根據經驗設置參數.
Dilshener 等人[45,46]從文本信息和堆棧跟蹤信息的角度出發,分析詞位置信息后發現,在缺陷報告總結中的第1、第2、倒數第2 和倒數第1 個詞很可能與對應的缺陷程序模塊相關;分析堆棧跟蹤后發現,缺陷程序模塊通常出現在堆棧跟蹤的前5 個文件中.他們對此采取的方法是,根據缺陷報告中的詞在程序模塊中出現的位置不同賦予不同的評分,例如,出現在文件名中的詞賦予更高的評分.
Swe 等人[47]從文本結構、堆棧跟蹤和相似缺陷報告這3 個角度計算缺陷報告和程序模塊的相似度.其中,文本結構僅考慮程序模塊的結構信息,通過抽象語法樹將程序模塊分為類名、方法名、變量名,分別與缺陷報告計算文本相似度.該方法最后通過對3 種評分進行線性擬合來定位缺陷.
Barbosa 等人[48]結合軟件特征對缺陷報告和程序模塊學習新的特征表示:在第1 階段,通過語言模型學習軟件工程領域文本數據的詞嵌入表示;第2 階段,通過一個由缺陷報告、程序模塊、代碼指標等形成的異構網絡學習一個基于網絡的特征表示.通過新的特征表示,可計算缺陷報告和程序模塊的相似度.
Rath 等人[49,50]分析了缺陷報告中的結構化信息對IRBL 的影響,他們將缺陷報告文本分為自然語言、源代碼和堆棧跟蹤這3 類,并形成7 種組合進行實驗.結果表明:源代碼文本通常能提高缺陷定位性能,堆棧跟蹤則有好有壞.
2) 基于優化函數的方法
IRBL 中,不同的特征有不同的意義,并且對多個軟件項目有不同的影響.憑經驗設置參數不具有通用性,通過參數學習方法可自動學出合適的參數.這類方法將缺陷定位問題轉換成基于參數學習的排序問題,即根據歷史缺陷報告修復信息對當前程序模塊與給定缺陷報告的相關性進行優化排序.該方法需定義一個優化函數或排序函數.
Ye 等人[51]提出一種基于學習排序(learning to rank)的方法,他們利用領域知識,結合代碼中使用的庫函數API 描述、缺陷修復歷史和代碼變更歷史,設計了6 類特征:表面詞匯相似度(surface lexical similarity)、API 增強詞匯相似度(API-enriched lexical similarity)、協同過濾評分(collaborative filtering score)、缺陷修復近因(bugfixing recency)、缺陷修復頻率(bug-fixing frequency).在標準化后,使用一個排序模型進行訓練,其評分函數f(r,c)定義如下.

其中,φi表示缺陷報告和程序模塊的第i類特征.Ye 等人[23]隨后額外使用了結構信息和文件依賴信息,他們將缺陷報告分為總結和描述,將程序模塊分為類名、函數名、變量名和注釋,然后兩兩計算相似度;同時,根據文件依賴信息定義包含入度和出度的局部特征、通過PageRank 計算的復雜度評分以及通過HITS(hyperlink-induced topic search)計算的Hubs 評分和Authorities 評分;之后,采用排序模型進行訓練優化.學習參數w等價于解決以下優化問題.

其中,w是權重參數矩陣,P(r)表示與缺陷報告r相關的程序模塊,N(r)表示與缺陷報告無關的程序模塊.
Zhao 等人[52]探討了學習排序算法在缺陷定位上的成本代價問題,即找到缺陷程序模塊所需檢查代碼行數的代價,并定義了3 個衡量代價的指標:Effort@k,MAE 和MFE.他們復現了Ye 等人的缺陷定位方法[51],并與VSM、Usual Suspects 方法進行了比較.實驗結果表明:學習排序算法在成本敏感指標上要顯著優于Usual Suspects,但在Effort@k上要差于VSM 算法.
Shi 等人[53]比較了學習排序算法在混合缺陷定位中的性能,他們將不僅考慮了文本相似度特征、還利用其他特征(如版本歷史、程序模塊結構、動態分析等特征)的缺陷定位方法定義為混合缺陷定位.在總結前人工作的基礎上,他們將輸入特征分為7 類:文本信息、堆棧跟蹤、版本歷史、依賴圖、文本結構、相似缺陷報告、執行信息,并對特征進行不同的歸一化操作:linear 歸一化、sum 歸一化、Z-score 歸一化以及不進行任何操作.Shi等人之后對8 種學習排序方法的性能進行比較,這8 種方法分別為MART(multiple additive regression trees)、RankNet、RankBoost、AdaRank、Coordinate Ascent、LambdaMART、ListNET 和Random Forests.實驗結果表明,沒有進行歸一化處理的coordinate ascent 算法是所以學習排序算法中性能最好的.
Wang 等人[34]從版本歷史、相似缺陷報告、結構信息、堆棧跟蹤和報告人信息的角度出發,計算了5 種特征,其綜合評分為5 種特征的加權求和.該方法使用遺傳算法對權重進行調參,優化目標為使歷史已修復缺陷報告的定位性能達到最高,即,使評價指標MAP 和MRR 總和達到最高.優化目標具體如下.

其中,MAP 和MRR 為IRBL 性能評估時常用的評測指標.
Gharibi 等人[54]設計了5 類特征:token 匹配評分、VSM 相似度評分、堆棧跟蹤評分、語義相似度評分和基于已修復缺陷報告的評分.其中,
· token 匹配評分是統計缺陷報告和程序模塊指定部分的token 匹配數:第1 階段檢查總結中是否包含程序模塊名,第2 階段則檢查總結和描述中的詞性token 與類名、方法名、注釋中的token 是否匹配.
· 基于已修復缺陷報告的評分則使用多標簽分類算法One-Vs-The-Rest 對缺陷報告進行分類.該方法基于目標函數ObjFunc=MRR+MAP對權重參數進行優化.
Almhana 等人[55]提出一種多目標優化方法,在最小化推薦的程序模塊數的同時,最大化提出方案的相關性.他們采用算法NSGA-II 進行搜索,候選集為一個向量表示,每一維表示推薦給缺陷報告的類,推薦類的順序對應它們在向量中的位置.其適應值函數為

其中,LS表示詞法相似度,由缺陷報告描述與程序模塊的相似度以及缺陷報告描述與推薦的程序模塊中函數API 說明的相似度組成;HS表示基于歷史的相似度,由程序模塊的歷史修復次數度量、最近的修改時間度量和歷史缺陷報告的推薦一致性指標決定.
(3) 基于查詢重構的方法
這類方法基于缺陷報告、程序模塊、堆棧跟蹤信息或者補丁等中的關鍵詞來嘗試構建新的查詢,并進行檢索.查詢重構方法基于不同的策略可進一步細分為查詢擴充(query expansion)、查詢替換(query replacement)、詞選擇(term selection)、查詢縮減(query reduction)[56].
Sisman 等人[57]基于程序模塊中描述相同概念或功能的詞距離比較接近的觀察,提出一個新的查詢重構框架,根據程序模塊中的詞與缺陷報告中的詞距離,構建一個新的查詢.該方法用初始查詢(即缺陷報告)檢索程序模塊語料庫,并從檢索結果中挑選出與初始查詢中詞距離最接近的詞,將其加入到初始查詢中,最后重新進行檢索.實驗結果表明:該方法能夠有效地提高缺陷定位性能,并且效果超過兩個經典的 QR 方法 Rocchio’s Formula[58]和Relevance Model[59].Sisman 等人[60]在之后的工作中進一步識別缺陷報告中的堆棧跟蹤信息或補丁,從這些結構組件中提取詞來構建最終的查詢.Chaparro 等人[61]發現:在大多數情況下,缺陷報告變成低質量查詢的原因是非相關詞的存在(即噪音),因此猜想,將低質量查詢刪減成只描述觀測行為(observed behavior,簡稱OB)的詞可以提高IRBL 的性能.其中,觀測行為指當前軟件的錯誤行為.觀測行為的識別主要通過人工識別,采用詞選擇策略選擇OB 詞進行刪減.實驗結果表明:當缺陷報告形成低質量查詢時,將缺陷報告詞刪減為觀測行為OB 相關的詞,能有效提高IRBL 的性能.Rahman 等人[62]提出了基于上下文感知的查詢重構方法,他們根據缺陷報告是否包含堆棧跟蹤信息和是否包含程序元素,將缺陷報告分為3 類:包含堆棧跟蹤的缺陷報告(即有噪聲的缺陷報告)BRST、包含程序元素的缺陷報告(即富余的缺陷報告)BRPE、只有自然語言的缺陷報告(即貧乏的缺陷報告)BRNL.針對包含不同信息的缺陷報告,Rahman 等人進行不同的處理:對于BRST,將堆棧跟蹤轉換為跟蹤圖(trace graph),節點為類名或方法名,邊表示節點間的依賴關系;對于 BRPE,基于詞共現(word cooccurrence)和詞性依賴(pos dependency)構建兩個文本圖(text graph);對于BRNL,搜集返回的前k個程序模塊,抽取其中的方法名或變量名等,并構建源詞圖(source term graph).隨后采用PageRank 方法進行詞權重賦值并挖掘關鍵詞,基于權重較大的前k個關鍵詞構建新的查詢.
缺陷報告的質量(即文本內容)有高有低,有些缺陷報告中包含堆棧跟蹤或文件名等信息,對查詢重構和缺陷定位有顯著影響.Mills 等人[63]探討了該類缺陷定位中存在的潛在偏見,比較了帶提示(包含代碼片段和方法名等)的缺陷報告和不帶提示的缺陷報告在通過遺傳算法進行近優查詢時的定位結果.實驗結果表明:在使用缺陷報告的全部文本作查詢時,尤其在沒有定位提示(即類名或方法名等)時,基于文本檢索的缺陷定位性能很差.但存在一個最優查詢,使其缺陷定位性能相比于默認查詢有較大的性能提升.該結論在沒有定位提示的缺陷報告中依然成立.他們認為,最優查詢的規劃在IRBL 中值得進一步研究.
3.1.3 基于文本相似度的方法間的對比
如表3 所示,該表統計基于文本相似度的方法所使用的軟件特征(僅列出CCF 列表中B 類以上的論文),·表示文獻使用了該列所對應的軟件特征.在基于輸入源拓展的方法中,研究人員使用的軟件特征逐漸增多.通過經典模型與軟件特征相結合,IRBL 的缺陷定位性能得到了有效提高.基于優化函數的方法在利用多個軟件特征的基礎上,定義一個優化目標.相較于基于輸入源拓展的方法,基于優化函數的方法可有效學習模型參數.基于查詢重構的方法在不利用額外輸入源的基礎上,提高了IRBL 的缺陷定位性能.從總體缺陷定位效果上比較,目前,基于優化函數的方法取得相對較好的性能.

Table 3 Usage statistics of the features used by text similarity methods表3 基于文本相似度的方法的特征使用情況統計
自然語言和程序語言存在較大的差異,因此造成缺陷報告與程序模塊間也存在較大的差異性.為解決詞匯不匹配問題,有研究人員從語義角度出發,通過提取文本語義特征來計算語義相似度.這類方法主要構建多層神經網絡,通過深度學習提取特征并計算.常用的可選模型有CNN(convolutional neural network),DNN(deep neural network)或LSTM(long short-term memory)等.
Huo 等人[70]借助CNN 來捕獲程序模塊中代碼的結構信息和語義信息,該方法的輸入為缺陷報告和程序模塊,主要結構包括語言內特征提取層和跨語言特征融合層:在語言內特征提取層,分別對缺陷報告和程序模塊提取詞法信息和程序結構信息;在跨語言特征融合層,將兩個向量拼接為一個統一的特征向量.之后,通過一個全連接層分類,其目標函數如下.

Lam 等人[72,73]使用DNN 解決缺陷報告和程序模塊的詞不匹配問題,并與基于軟件特征的方法相結合,提出了HyLoc 方法.HyLoc 方法使用rVSM 收集缺陷報告和程序模塊的文本相似度特征;根據項目元數據獲取缺陷修復頻率、類名相似度等特征;通過DNN 網絡學習缺陷報告和程序模塊的標識符、類名、函數名、注釋以及API 描述的關聯;最后,通過一個DNN 特征融合層學習各類特征的權重參數.
Xiao 等人[74]充分利用缺陷報告和程序模塊中的語義信息,并將CNN 和缺陷修復歷史信息相結合,提出了基于增強CNN 的DeepLocator.該方法將預處理后的缺陷報告和程序模塊用詞嵌入向量表示,以缺陷報告和程序模塊中最大句子長度為單位,填充每個句子到同一維度,作為增強CNN 的輸入.增強CNN 包含1 個卷積層、1個最大池化層和1 個dropout 層,在代價函數中引入缺陷修復近因和缺陷修復頻率,具體如下.

其中,N是batch 大小,T為程序模塊的數目.costi為缺陷報告i的代價函數,tij為缺陷報告i關于程序模塊j的真實值,yij是缺陷報告i關于程序模塊j的輸出概率值,ω1和ω2是缺陷修復近因和缺陷修復頻率權重調節參數.Xiao等人[75]隨后改進了文獻[74]的模型,從語句角度出發,將語句表示為一個向量,對缺陷報告和程序模塊采用兩種不同的詞嵌入技術:Sent2Vec 和加權平均嵌入(weighted average word2vec).缺陷報告的描述通過Sent2Vec 可將其中的每個句子轉化為一個向量,這個策略在降低內存占用和計算代價的同時,獲得與word2vec 相似或更好的性能,程序模塊通過加權平均嵌入可獲得每個代碼語句的嵌入表示.隨后,通過CNN 對缺陷報告和程序模塊的向量表示進行特征檢測和提取,統一兩個向量的維度以便平行拼接,其最終代價函數與文獻[74]中相同.
Xiao 等人[76]使用詞嵌入將缺陷報告和程序模塊轉換為向量,保存語義信息,然后考慮到缺陷報告和程序模塊的不同特性,對缺陷報告使用多filter 的CNN 網絡提取特征和降維,對程序模塊使用多粒度掃描的隨機森林,最后通過兩個CRF(completely-random tree forests)和兩個隨機森林形成的級聯森林來提取缺陷報告和程序模塊的深層特征并分類.
缺陷報告和程序模塊具有不同的表達方式.Xiao 等人[77]首次將機器翻譯技術用于解決缺陷報告和程序模塊的詞不匹配問題.該方法的訓練實例為缺陷報告和對應缺陷程序模塊解析的抽象語法樹節點形成的文本對以及從API 文檔中提取的類、函數、字段的注釋與其聲明、函數調用、類實例形成的文本對.該方法通過一個基于注意力機制的RNN 編碼器和RNN 解碼器訓練模型.當給定一個新的缺陷報告,該方法基于缺陷報告和程序模塊的概率評分來定位缺陷程序模塊.
現有的基于深度學習的缺陷定位技術大多集中于新型網絡結構的設計,而對網絡損失函數的設計缺乏應有的關注.已有的工作大多在輸出層使用sigmoid 函數作為激活函數,采用交叉熵損失進行訓練.這種損失函數對距離分類邊界較遠的異常點比較敏感,限制了缺陷定位性能的提升.針對這個問題,解錚等人[78]提出一種代價敏感的間隔分布優化損失函數,將間隔分布優化問題通過代價敏感的方式擴展至非對稱情況.該方法通過一層卷積層和一層池化層對缺陷報告提取特征,通過2 個卷積層和2 個池化層對程序模塊提取特征,然后拼接兩個特征表示,并通過全連接層學習一個統一的特征映射,最后通過訓練好的模型定位缺陷程序模塊.
從定位模式分析,基于文本相似度的方法主要考慮缺陷報告和程序模塊的共有詞匹配,尤其缺陷報告中的程序實體名與程序模塊中的程序實體名的匹配.Wang 等人[79]早期以基于文本相似度的方法為基準方法評價IRBL 技術的有效性,他們發現:缺陷報告中的程序實體名通常對IRBL 的性能起正面作用,缺陷報告中的堆棧跟蹤信息和測試用例信息則并不總是有效的,因其會引入許多無關的程序模塊.而如果僅利用基于自然語言描述的缺陷報告,IRBL 方法的缺陷定位性能通常并不理想.基于文本相似度的方法對由自然語言和程序語言差異造成的詞不匹配問題并不能很好地予以解決,從查詢優化的角度來試識別并過濾掉缺陷報告中的冗余和無效文本以及從軟件項目中挖掘與缺陷程序模塊相關的特征信息等措施,是從其他角度補充缺陷定位所需的信息,提升定位準確率.基于語義相似度的方法主要挖掘缺陷報告和程序模塊的內在語義,從詞義[76]、語義[76]、程序結構[70]和語句順序[71]等多個角度考慮,并通過學習API 文檔、項目文檔等獲取額外知識[77,80],以緩解缺陷報告和程序模塊的詞不匹配問題.Polisetty 等人[81]在分析基于深度學習的缺陷定位方法在軟件開發中的可用性時,與部分基于文本相似度的方法進行了比較,并從縮小詞匯差異、方法有效性和方法普適性等角度進行分析研究.結果表明:基于深度學習的方法,其缺陷定位性能要優于基于傳統檢索模型的方法,并可有效緩解詞不匹配問題,但也需要更多的訓練時間和硬件資源.
從定位粒度的角度分析,基于文本相似度的方法根據選擇方法的不同,可定位到文件、函數、語句和代碼變更等級別;而基于語義相似度的方法因模型訓練因素,一般都定位到文件級別.受限于應用場景和開發人員的實際需求,這兩類方法各有優缺點.
根據不同的場景需求,開發人員對缺陷定位粒度和準確率的需求不同.基于IRBL 的定位粒度,IRBL 方法輸出級別可分為文件(類)級別、函數級別、語句級別和代碼變更級別,下面將依次介紹.其中,文件和類級別因多數文件是單個文件包含單個類,文件和類的文本量級比較接近,對IRBL 方法而言幾乎沒有區別,因此不作區分.
目前,大多數IRBL 方法都定位到文件級別.給定一個缺陷報告,將一個按照缺陷懷疑率從大到小排序的有序文件列表推薦給開發人員.文件級別缺陷定位因其代碼文本包含足夠多的信息,可將IR 方法直接應用于文件級別的缺陷定位.
Klnc 等人[82]通過多級重排序算法來實現文件級別的缺陷定位:在第1 級,為解決詞的語義信息被忽視的問題,從程序模塊中提取出去除注釋的代碼、類名、方法名和注釋4 類文檔,分別計算與缺陷報告的相似度并調整權重;在第2 級,在第1 級的基礎上保存每個缺陷報告對應的前k個程序模塊形成新的文檔集,丟棄不相關的程序模塊,重新構建新的索引并查詢,將兩級的結果綜合考慮.
陳理國等人[83]提出了基于高斯過程的缺陷定位方法.基于高斯過程的缺陷定位,其直觀含義可以表述為:每個缺陷報告節點和程序模塊節點對對應一個隱含函數值,隱含函數值完全決定了節點對之間是否有鏈接關系,且隱含函數值服從高斯分布,協方差函數與缺陷報告節點和源文件節點對應的向量相關.陳理國等人首先采用優先采集算法,使得樣本集中的正負樣本是均等的;然后學習缺陷報告和程序模塊節點對隱含函數值的高斯分布,當隱含值大于指定閾值時,則預測值為1,程序模塊與缺陷報告相關.
Distante 等人[84]提出一個兩階段缺陷定位方法:第1 階段,針對每個程序模塊訓練一個多層感知機,對新來的缺陷報告預測該程序模塊是否與缺陷報告相關,相關的程序模塊集合即為缺陷程序模塊集合;第2 階段,對與缺陷程序模塊相關的多個缺陷報告表示求其平均表示,計算新的缺陷報告與相關缺陷報告平均表示的相似度,根據相似度結果排序選前K個候選缺陷程序模塊,優化排序結果.
除以上常見方法外,在基于文件級別的缺陷定位中存在一類特殊的方法,在推薦有序缺陷列表前會執行一個可靠性判斷.因在IRBL 中,總存在一些缺陷報告缺乏足夠的定位信息,造成IRBL 方法定位效果不理想.如果將不理想的缺陷定位結果推薦給開發人員,反而會增加缺陷定位成本,并降低缺陷定位方法的可信度.針對這個問題,Kim 等人[85]提出一種兩階段推薦模型,判斷缺陷報告是否含有足夠的信息,只有在缺陷報告包含足夠的信息時,才進一步基于缺陷報告的內容預測缺陷模塊.他們從缺陷報告的總結、描述、元數據以及報告者的評論中抽取特征,缺陷報告可預測的標準是基于缺陷報告特征使用樸素貝葉斯模型推薦的前k個程序模塊中,命中至少一個缺陷程序模塊,則該缺陷報告被認為是可預測的.基于歷史缺陷報告訓練一個二分類模型后,可判斷新的缺陷報告是否可預測,然后對可預測的缺陷報告使用多分類模型推薦缺陷程序模塊.Le 等人[86,87]則通過構建一個喻言(oracle)數據庫,自動預測IRBL 方法生成的排序列表是否有用.他們認為:一個排序列表是有用的,僅當缺陷程序模塊出現在該排序列表的前N位.其考慮的特征分為4 類:懷疑率的評分特征(含有64 個特征)、報告的文本特征(含有2 個特征)、主題模型特征(含有8 個特征)和元數據特征(含有14 個特征),在這4 大類特征上分別預測有效性,并加權計算得到最終評分.當評分大于某個閾值時,則排序列表有效;反之則無效.
類和文件級別對開發人員而言存在粒度過粗的問題,需要開發人員檢查大量的代碼.通常,缺陷的修復是位于某個函數代碼內.給定一個缺陷報告,基于函數級別的缺陷定位方法可以將一個按照缺陷懷疑率從大到小排序的有序函數列表推薦給開發人員.然而函數級別的缺陷定位相比于文件級別的缺陷定位,因為粒度縮小,每個函數包含的代碼文本和詞匯數要少許多,這會導致傳統的信息檢索模型因為稀疏表示問題運行困難.
有研究人員從文本擴充的角度出發,增加函數相關詞的數量.Nichols[88]提出一個函數級別的IRBL 方法,依據缺陷報告的修復記錄,將缺陷報告中的詞加入到對應缺陷程序模塊受影響的函數代碼中,這樣函數就額外包含與修復缺陷相關的缺陷文本信息.當一個新的缺陷報告到來時,用LSI 模型檢索增強后的函數文本.
張文等人[89]考慮另一種函數增強方法,對于每個函數,計算該函數與其他所有函數的相似度并求其平均值,將大于平均值的函數向量表示擴充進該函數中,其計算公式如下.

其中,mi,mk分別表示函數i和函數k的向量表示,cos(mi,mk)表示函數i和函數k的余弦相似度,θi表示函數i與其他函數的余弦相似度的平均值.之后,張文等人[90]改進了函數增強方法,從語義相似度、時間近似和調用依賴這3 個角度衡量函數之間的相似程度,每個函數的向量表示由k個最相似函數的向量表示構成,其計算公式如下.

其中,mk表示函數k的向量表示,acik是從3 個角度衡量函數i和函數k的相似度的加權和.針對新來的缺陷報告,可基于增強后的函數進行檢索.
Youm 等人[67]將缺陷定位粒度從文件級別拓展至函數級別,在獲得文件級別的可疑文件排序列表的基礎上,對前10 的文件中的函數計算其與缺陷報告的文本相似度,然后根據代碼變更歷史信息,找出報告提交的k天內被修改的函數并計算函數修改評分,兩者加權計算可得函數的懷疑評分.
Rahman等人[91,92]提出了函數級別的缺陷定位方法MBuM,通過最小化搜索空間來提高定位準確度.他們將動態分析和靜態分析相結合,首先根據程序模塊執行路徑獲取函數調用順序,排除不相關的函數;然后根據函數名對函數內容進行靜態分析,基于缺陷報告檢索函數內容.為了避免語義信息的損失,MBuM 還進行同義詞匹配,如“terminate”,“stop”與“close”詞同義.實驗結果表明,MBuM 在大部分用例中將缺陷函數排在第一位.
Davies 等人[66]綜合多源信息設計與函數強相關的特征,從文本信息的角度計算缺陷報告描述與函數的相似度;從缺陷報告的角度,用歷史缺陷報告作為文檔集,對每個函數訓練一個二分類器,判斷缺陷報告是否與函數相關,然后對新來的缺陷報告為每個函數做分類;同時統計每個函數曾包含的缺陷數以及在堆棧跟蹤的排名的倒數;最后,基于這4 類特征使用線性回歸方法來定位缺陷.
針對函數級別缺陷定位,也有研究人員不作區分,將函數級別和文件級別陷定位統一對待.Chaparro[93]將缺陷報告的描述分為5 個部分:標題、觀測行為OB、期望行為(expected behavior)、復現步驟和代碼片段.這些文本識別都是通過人工識別,然后對這5 個部分排列組合可形成31 個不同的重構策略,其檢索文檔為文件、類或函數.實驗結果表明:標題和觀察行為相結合是最好的重構策略,并在大部分樣例中都適用.基于缺陷報告描述的查詢重構能有效去除報告中的噪音,提高缺陷定位性能.Hill 等人[94]考慮使用詞的位置距離(positional proximity)來度量程序模塊和缺陷報告的相似度,以整合詞鄰近和詞序信息,捕捉其語義信息.他們直接比較了8種方法:順序依賴馬爾科夫隨機場(MRF-SD)、DLM(Dirichlet language model)、基于語句距離的方法(STMT)、基于函數距離的方法(MTHD)、TF-IDF 方法、NL-Sig、NL-Body、SWUM(software word usage model).其中,NL-Sig只使用從函數簽名(method signatures)中提取的短語概念,NL-Body 使用從函數的方法調用中提取的短語概念,SWUM 則結合NL-Sig 和應用于函數的TF-IDF.實驗結果表明:位置距離對函數級別的定位提升不如文件級別定位明顯,其中,MRF 和其變種DLM 在多個數據集上都更加有效.
基于語句級別的缺陷定位因為文本內容過少,需設計與語句強相關的特征.Rahman 等人[95]提出了語句級別的缺陷定位方法MSDG,采用動態分析和靜態分析相結合的方式.首先跟蹤程序模塊執行過程,丟棄不相關的程序模塊,將相關的函數文本保留并處理;之后進行靜態分析,MSDG 最大化每個語句的有效信息,將該語句和影響該語句每個元素的前語句信息加入一起考慮,生成節點和前節點依賴圖,每個語句節點包含該語句及其前語句的關鍵詞,最后計算缺陷報告與語句節點的文本相似度.同樣,為了增加語句的信息,MSDG 定位時考慮語句對應函數的相似度評分和語句相似度評分,計算公式如下.

其中,MS和NS分別表示包含語句S的函數的評分和語句S本身的相似度評分.
從實際角度出發,向開發人員推薦與缺陷報告直接相關的程序模塊列表并不能提供修復缺陷的上下文信息.列表中的程序模塊排序獨立,開發人員只可能知道缺陷在哪,不知道什么引起的缺陷.基于代碼變更級別的缺陷定位方法定位到一次代碼變更(即在一次提交中被修改的多行代碼,也被稱為變更塊(change hunk)),可輔助開發人員理解缺陷,簡化缺陷修復任務.
Wen 等人[68]認為,基于代碼變更的缺陷定位有一些優勢:首先,描述變更的日志包含代碼變更目的、功能等重要信息;其次,變更塊通常是小段小段的代碼,是分割源代碼文件的一個可選方案,避免了大文件的噪音問題;最后,利用變更歷史可以增強缺陷定位性能.他們為此提出了Locus 方法,使用缺陷報告、該缺陷報告創建前的所有變更塊作為輸入,每個變更塊包含改變代碼行、上下文行的內容和相應的提交日志,可創建自然語言語料庫和代碼實體語料庫.Locus 針對這兩個語料庫分別進行自然語言查詢和程序實體查詢,即分別計算缺陷報告與自然語言語料庫和代碼實體語料庫的相似度;之后,Locus 根據代碼變更歷史對代碼變更或文件計算一個增強評分(即越近的代碼修改越有可能引入缺陷),其可定位代碼變更級別或文件級別.實驗結果表明:相較于基于文件級別的缺陷定位,基于代碼變更的方法始終是最優的.
Loyola 等人[96]從語法和代碼變更依賴的角度對代碼變更學習特征表示,提出一個基于代碼變更的缺陷定位方法.該方法對缺陷報告中的詞進行詞嵌入表示和字符級別的嵌入表示,并通過雙向LSTM 生成一個上下文豐富的特征表示;對代碼變更的語法表示通過雙線性LSTM 接收一系列詞,并將最終輸出的狀態作為語法特征表示,對代碼變更依賴則定義了一個代碼變更譜圖(code change genealogy),通過隨機游走(random walk)獲得節點的嵌入表示,作為變更依賴表示.該方法之后合并特征,并通過一個學習排序算法RankNet 計算相關評分.
該節對不同定位粒度的IRBL 方法進行總結.各定位級別所占論文比例如圖4 所示.文件級別的缺陷定位論文占據IRBL 論文3/4 的比例,是所有定位粒度中最多的.該定位粒度數據集獲取容易、程序模塊代碼大小適當,被研究人員廣泛研究,定位準確率較高.目前,文件級別缺陷定位的公開數據集和共享實驗代碼也是最多的.函數級別的缺陷定位數據集獲取困難,程序模塊代碼行偏少,一般需要進行額外處理,缺陷定位準確率相較于文件級別缺陷定位偏低[67].語句級別的缺陷定位則必須獲取程序的執行信息,動態分析和靜態分析相結合.有研究表明[97]:開發人員更傾向于選擇函數、語句和塊級別的缺陷定位方法,文件級別的缺陷定位帶來的高準確率并不能滿足所有開發人員的需求,而且IRBL 方法的可靠性也讓眾多開發人員難以接受.目前,IRBL 方法無論從缺陷定位準確率或是缺陷定位粒度,都有待提高.

Fig.4 Statistics of the number of papers with different granularity levels for IRBL圖4 IRBL 不同定位粒度方法的論文數統計
為了方便后續研究工作更好地評估所提的IRBL 方法,本文總結研究人員在IRBL 中所使用的評測指標.IRBL 可視為一個經典的信息檢索問題,因此可用信息檢索領域的常用評測指標進行評估(注意:與缺陷報告相關的程序模塊可能不止1 個).我們假定有Q個缺陷報告需要被查詢,將已有研究工作中常用的模型性能評測指標總結如下.
(1) MAP(mean average precision):該指標返回的是所有缺陷報告的平均查準率的均值.平均查準率是對一個檢索結果在不同召回率點上的查準率進行平均,其計算公式為

其中,
?pos(j)表示排名為j的實例是否與缺陷報告相關:相關為1,否則為0.
?P(j)表示檢索在j位置時的查準率.
?AvgPi表示查詢i的平均檢索查準率.
?MAP表示Q個查詢的平均查準率的均值.
(2) TopKRank:該指標在有些文獻中又被稱為Accuracy@k[75]、Hit@k[62]、Prediction Accuracy[25]、Recall at TopN[33]等,其返回正確定位的缺陷報告占所有缺陷報告的比例.正確定位的缺陷報告指在推薦的前k(k=1,5,10)個程序模塊中至少包含一個缺陷程序模塊,在有些文獻中,這個指標返回的是正確定位的缺陷報告的個數,這里,我們把該指標統一為比例.
(3) MRR(mean reciprocal rank):該指標返回的是一系列查詢的倒數排名的平均.一個查詢的倒數排名指第1 個相關文檔的排名的倒數,即缺陷程序模塊排名的倒數,其計算公式為

其中,ranki表示第1 個相關文件的排名.
(4)P@t:該指標返回的是在給定排序t為止檢索的平均查準率.在指定t值時,有些文獻直接以查準率(precision)表示P@t.其計算公式為


其中,P(t)計算推薦t個程序模塊時的查準率.
(5)R@t:該指標在一些文獻中又被稱為Average Coverage Ratio[28],其返回的是在給定排序t為止檢索的平均查全率.在指定t值時,有些文獻直接以查全率(recall)表示R@t.其計算公式為

其中,R(t)計算推薦t個程序模塊時的查全率.
(6) First Relevant Rank:該指標返回的是排序列表中第1 個缺陷程序模塊的排名.
(7)f-measure:該指標返回的是查準率和查全率的調和平均數,可以對查準率和查全率這兩個指標進行有效的平衡,其計算公式為

(8) SCORE:該指標返回的是不需要被開發人員調查的程序模塊的比例,其計算公式為

其中,m表示缺陷程序模塊的個數,pm表示第m個缺陷程序模塊的排名,N表示所有程序模塊的個數.
(9) Rank of Retrieved Files:該指標返回的是第1 個相關文件在指定范圍的缺陷報告個數.通常有rank=1,2≤rank≤5,6≤rank≤10 和rank>10 的范圍.
(10) Avg.Rank:該指標返回的是所有缺陷模塊的平均排名.其計算公式為

其中,FB表示缺陷報告的真實修復程序模塊,FR表示推薦的缺陷程序模塊,rankf表示程序模塊f的排名.
(11) AFH@n(average first hit at top-n):該指標返回的是排序列表中第1 個缺陷程序模塊的平均排名,衡量開發人員的工作量,其計算公式為

其中,ranki表示排序列表中第1 個缺陷模塊的排名.
上述指標都是從程序模塊的角度考慮,Zhao 等人[52]首次從代價敏感(cost-effective)的角度分析,基于代碼審查工作新定義3 個缺陷定位性能指標:Effort@k、MAE(mean average effort)、MFE(mean first effort),具體如下.
(1) Effort@t:該指標返回的是成功定位相關缺陷程序模塊所花費的平均代碼審查成本.其計算公式為

其中,fij表示缺陷報告i的排序列表中第j個程序模塊,LOC 函數表示程序模塊的代碼行數,Rs表示成功定位的缺陷報告數.
(2) MAE:該指標返回的是定位缺陷報告的所有缺陷程序模塊所花費的平均成本的均值,是指標MAP 的成本代價變種.其計算公式為

(3) MFE:該指標返回的是定位缺陷報告的第1 個缺陷程序模塊所花費的成本的均值.其計算公式為

其中,ranki為缺陷報告i第1 個缺陷程序模塊的排名.
本文對已有IRBL 研究中常用的性能評測指標的累計使用次數進行了統計,并從大到小進行排序;同時給出了每個指標的首次使用時間(包括對應的參考文獻),最終結果見表4.從表中不難看出:經常使用的評測指標是MAP、TopKRank 和MRR,這些指標使用率遠超其他指標.除此之外,一些研究人員從成本收益角度來評估模型的缺陷定位性能,主要考慮的指標包括Effort@k、MAE 和MFE.

Table 4 Statistics of performance evaluation measures表4 性能評測指標統計
在IRBL 中,因開源軟件項目數據獲取相對容易,研究人員一般使用開源軟件項目進行科學研究.這一節,本文對IRBL 中常被使用的評測數據集其累計使用次數和首次使用時間進行總結,方便后續研究人員進行實驗對比.其最終結果見表5(表5 僅列出累計使用次數超過3 次的評測數據集).

Table 5 Usage statistics of evaluation datasets表5 評測數據集的使用情況統計
IRBL 中的缺陷定位數據集需要搜集缺陷報告和軟件代碼,進行鏈接關系分析,建立缺陷報告和軟件代碼的關聯,具體過程如圖5 所示.缺陷報告通常使用爬蟲方法從缺陷跟蹤系統中抓取,再人工過濾掉不屬于缺陷的報告,缺陷管理工具主要為Bugzilla 和JIRA 等.軟件代碼因為大部分用于研究的軟件項目是開源的,可從網上直接下載源代碼,其軟件代碼管理工具主要為Git、CVS 和SVN 等.鏈接關系分析一般采用Dallmeier 等人[98]提出的啟發式方法,有顯式的提交編號(commit id)則檢查對應的提交記錄,其對應的代碼變更視為一個缺陷修復變更;同時,也從提交日志中檢索與缺陷報告ID 相關的提交,確定對應變更與缺陷修復是否相關.

Fig.5 Collection process of bug localization datasets圖5 缺陷定位數據集的收集過程
早期由于缺陷定位數據集并未共享,研究人員主要對開源軟件項目的少量缺陷報告進行用例分析[51],造成相關研究工作難以重現,相關論文數較少.從2012 年開始,隨著Eclipse、SWT、AspectJ 和Zxing 缺陷定位數據集的公開,對IRBL 問題的研究開始逐步升溫.在2014 年,Ye 等人[51]共享了Birt、Tomcat 等新的缺陷定位數據集,Wang 等人[100]還提供了一個便于研究人員比較和復現缺陷定位技術的實驗平臺BOAT.這些公開數據集及共享實驗代碼的增多,使得IRBL 問題成為當前軟件缺陷定位領域的一個研究熱點,并產生了很多高質量的研究成果.接下來,本文將對這些數據集進行簡要介紹.
有研究表明:Bugzilla 中的缺陷報告與修復代碼是弱關聯的;而JIRA 中的缺陷報告與修復代碼則關聯明顯,主要因為JIRA 提供了附件幫助關聯問題(issue)和版本控制系統中的提交[101].本文對由JIRA 管理的數據集和其他數據集分別進行介紹.
在上述數據集中,由JIRA 管理的數據集有Lucene、JBOSS、APACHE、Derby 和Pig 等.其中,
· Lucene 是一個開放源代碼的全文檢索引擎工具包.在缺陷定位研究中使用的Lucene 版本和報告數不盡相同,有的研究中包含2 443 個缺陷報告,有的則只包含30 個缺陷報告.
· JBOSS 是一個基于J2EE 的開放源代碼的應用服務器,Lal 等人[12]抽取了569 個缺陷報告,Lee 等人[102]則對JBoss 中不同項目(例如ENTESB、JBMETA、ELY、SWARM、WFARQ 等)分別抽取缺陷報告,構建多個數據集,缺陷報告從1 個到984 個不等.
· APACHE 是一個Web 服務器軟件,目前在Web 服務器軟件中全世界使用率第一,Lal 等人[12]抽取了637個缺陷報告.
· Derby 是一個完全使用java 編寫的數據庫系統.
· Pig 是一種數據流語言,Moreno 等人[20]在研究中各抽取了2 個版本、累計129 和133 個缺陷報告進行實驗.
在缺陷定位研究中,這些數據集存在多個版本,研究人員基于實際需要選擇特定版本內的缺陷報告作為實驗對象.
對于其他數據集,多數軟件項目都是使用Bugzilla 作為缺陷跟蹤系統,少部分使用Github 管理缺陷報告或問題報告.其中,AspectJ、SWT、Eclipse、JDT、Birt、PDE 和Eclipse Platform 等都來自開源軟件項目Eclipse,Tomcat則是Jakarta 項目中的一個核心項目,這些軟件項目都是由Bugzilla 管理的.Zxing 是一個開放源碼的,用Java 實現的多種格式的1D/2D 條碼圖像處理庫,其缺陷管理工具是Github,包含20 個缺陷報告.
從以上統計可發現:即使是相同的軟件項目,由于不同研究人員的需求不同,使用的缺陷報告也不盡相同.同一個缺陷報告,根據研究人員定位要求的不同,缺陷報告關聯的缺陷程序模塊粒度也會不同.以后隨著公開數據集的增多,對IRBL 方法的普適性和通用性研究可在更多數據集中驗證.
目前,基于信息檢索的缺陷定位雖然已經取得了一定的研究進展,但缺陷定位的準確率和可靠度還有待提高,這也是當前軟件缺陷定位研究成果難以成功應用到企業軟件質量保障流程的主要阻礙之一.雖然有一些缺陷定位工具[103]被實現出來給開發人員使用,但距離被多數開發人員認可還存在一定的距離.對基于信息檢索的缺陷定位的研究具有豐富的理論研究價值和工業界應用前景,我們認為,IRBL 還存在很多值得國內研究人員關注的研究問題.本文將依次從數據源、檢索模型、場景應用這3 個維度對未來研究工作進行展望.
(1) 針對數據源的研究展望
通過對評測數據集采集過程的分析,我們發現在挖掘軟件歷史倉庫的過程中,對程序模塊進行類型標記時可能會產生噪音.這些噪音的存在會影響缺陷定位模型的構建,并對已有實證研究結論的有效性產生嚴重影響.
· 首先,將缺陷報告從問題報告中識別出時就可能產生噪音.Herzig 等人[104]指出:在問題跟蹤系統中大量問題報告被錯誤分類,接近1/3 被標記為缺陷的問題報告不是真的缺陷報告.他們指出,這種偏差嚴重影響了對基于歷史先驗缺陷的缺陷預測研究.
· 其次,將版本控制系統中的修改日志與缺陷跟蹤系統中的缺陷報告建立鏈接關系時容易產生噪音.例如:通過在提交日志中搜索特定關鍵詞(例如fixed 或bug)和缺陷ID 號(例#53322)可建立一種鏈接關系,隨后,基于該鏈接關系將代碼修改涉及的程序模塊標記為缺陷模塊,與缺陷報告對應起來.但并不是所有修改的程序模塊都是有缺陷的,有些程序模塊變更是一些非必要變更.
除了數據集的Ground Truth 的可靠性問題,數據集中的缺陷報告質量也存在巨大差異,對IRBL 有顯著影響.Kochhar 等人[99]就此分析了IRBL 中存在的潛在偏見,實驗結果表明:缺陷報告錯誤分類的影響是可以忽略不計的;而因建立鏈接關系造成的不準確的Ground Truth 對缺陷定位結果的影響也不大;顯著地影響缺陷定位結果的是那些已定位的缺陷報告.已定位的缺陷報告指那些文本描述中已經指定包含缺陷程序模塊文本的報告,這些已定位報告不需要額外的缺陷定位方法.實驗表明:那些已定位或部分定位的缺陷報告比那些非已定位的缺陷報告準確率高得多,對缺陷定位性能影響很大.
針對數據集的質量問題,研究人員可以在收集數據集時選擇由JIRA 管理的軟件項目,加強缺陷報告和修復提交的關聯,以提高缺陷數據集的質量.針對缺陷報告的質量問題,一方面,在用戶提交缺陷報告時對缺陷報告的質量進行把關,有研究人員考慮在用戶提交缺陷報告時檢測缺失信息并給出反饋[61];另一方面,針對低質量的缺陷報告,可通過查詢重構等方式來提高缺陷定位性能.Lawrie 等人[69]分析了基于遺傳算法的查詢重構方法,發現該方法的優化目標主要基于查詢性能指標,因此存在一定的作弊問題.他們采用了基于自動總結的方法,并分析了該方法在不作弊的情況下是否可以進行高質量的查詢重構.結果表明,該方法的效果還有待提高.雖然上述方法對數據集質量進行了初步的探索,但如何進一步提升缺陷報告質量以提高最終的缺陷定位效果,仍是一個亟待解決的問題.
(2) 針對檢索模型的研究展望
目前,針對檢索模型的研究存在多個問題.
· 首先,檢索模型的缺陷定位準確性和實際應用的需求存在較大差距,仍有較大的提升空間.研究人員可引入軟件缺陷預測等領域的知識,設計與缺陷報告和缺陷程序模塊相關的軟件特征,提高缺陷定位準確率;同時,IRBL 作為一個檢索問題,可進一步引入信息檢索領域內的最新研究成果,充分利用來自Stack Overflow 的眾包知識、API 文檔和軟件項目文檔等來改進模型,輔助解決缺陷報告和缺陷程序模塊的詞不匹配問題.
· 其次,目前的檢索模型很少探討訓練數據不足的問題.當開發人員團隊開發一個新的軟件項目時,新項目會存在訓練數據不足的問題,這需要利用其他軟件項目的訓練數據來建立模型.但不同項目的訓練數據因項目的管理方式、人員構成、采用的編程語言不同,會存在較大的數據分布差異.因此,如何借助遷移學習方法來緩解這種數據分布差異問題,是一個研究難點.Huo 等人[105]在這個方面進行了嘗試,首次提出了跨項目缺陷定位方法,通過一個深度遷移學習模型,解決目標項目訓練數據不足的問題.該方法主要包含遷移特征提取層和項目指定預測層:在遷移特征提取層,通過CNN 共享權重參數的方式將知識從原項目遷移到目標項目;在項目指定預測層,通過兩個全連接層共同訓練原項目和目標項目.
· 最后,隨著軟件快速頻繁地演化,如果每次演化后都需要重新訓練檢索模型,則存在過程重復并且訓練費時費力等問題,因此,模型的增量更新是一種有效的解決方案.對此,Rao 等人[64]提出一個增量更新框架,使用每次軟件演化中的所有代碼變更信息來持續地更新索引和模型,對VSM 模型和SUM 提出索引更新方法和增量更新規則.實驗結果表明,該方法僅需額外花費少量時間即可獲得同樣的檢索準確率.Rao 等人[106]隨后又比較了兩種基于LSI 的增量更新方法iLSI 和iSVD,隨著項目的演化,可以增量更新模型的參數.
在軟件項目的不同階段會遇到不同的問題,采用合適的IRBL 方法以適應軟件開發過程、保障軟件質量,是一個值得探索的方向.
(3) 針對場景應用的研究展望
目前,IRBL 方法大多基于Java 語言開發的軟件工程項目,對其他類型語言的軟件項目研究較少.面向對象語言和面向過程語言對編程風格和習慣有很大影響,其對缺陷定位造成的影響很值得研究.為此,Saha 等人[65]探索了IRBL 在C 語言上的有效性.他們拓展了BLUiR 方法用于C 語言的缺陷定位,實驗結果表明:在C 語言軟件項目上,基于IR 的缺陷定位方法一樣有效;不過,部分軟件特征如結構信息等,對C 語言軟件項目的益處并不大.
Garnier 等人[107]對先前工作中數據集存在的問題進行了改進,在20 個C#軟件項目上,評估BLUiR、BLUiR+和AmaLgam 方法的有效性:首先是版本選擇問題,實驗中找到缺陷報告創建前的提交版本,確保每個缺陷報告都定位到其對應的版本;然后是缺陷報告選擇問題,排除已定位缺陷報告的出現;最后是程序模塊選擇問題,移除用于測試的程序模塊.實驗結果表明:基于IR 的缺陷定位方法在C#軟件項目上依然有效,并且將更多的程序構造(如字符串文字、接口、枚舉類型等)加入結構化信息檢索的考慮之中,能有效提高缺陷定位性能.除基于C和C#開發的項目外,IRBL 方法在基于其他編程語言開發的軟件項目上的缺陷定位性能仍需要進一步探討.
除了從橫向維度進行拓展,模型也可從縱向維度進行考慮.當前,文件級別的缺陷定位數據集是最多的,函數和代碼變更級別的缺陷定位數據集較少.因此,研究人員可以繼續挖掘、搜集和共享更多細粒度的數據集,分析IRBL 方法在相關數據集上的有效性[79],并通過提高細粒度缺陷定位的性能,以滿足開發人員的實際定位需求,促進軟件缺陷定位的研究成果應用到工業界中.
若能對上述研究挑戰提出有效的解決方案,將使得軟件缺陷定位更好地應用于項目開發和維護過程,并有助于快速定位缺陷程序模塊,減輕開發人員負擔,最終提高軟件產品的質量.