• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于信息檢索的軟件缺陷定位方法綜述*

      2021-03-06 09:28:36李政亮蔣智威
      軟件學(xué)報 2021年2期
      關(guān)鍵詞:程序模塊代碼報告

      李政亮 ,陳 翔,2 ,蔣智威 ,顧 慶

      1(計算機(jī)軟件新技術(shù)國家重點實驗室(南京大學(xué)),江蘇 南京 210023)

      2(南通大學(xué) 信息科學(xué)技術(shù)學(xué)院,江蘇 南通 226019)

      在軟件開發(fā)過程中,軟件缺陷(software bug)難以避免.對需求理解的偏差、不合理的軟件開發(fā)過程、抑或開發(fā)人員的疏忽,均有可能在軟件項目內(nèi)引入軟件缺陷.這些含有缺陷的軟件產(chǎn)品在部署后,可能會產(chǎn)生無法預(yù)測的行為或結(jié)果,甚至?xí)θ藗兊纳a(chǎn)和生活方式產(chǎn)生重大影響.當(dāng)檢測到軟件內(nèi)存在缺陷時,開發(fā)人員需要借助軟件調(diào)試定位并修復(fù)缺陷.傳統(tǒng)的軟件調(diào)試方法主要借助手工調(diào)試,在可疑代碼處設(shè)置程序斷點,隨后重復(fù)執(zhí)行失敗的測試用例,并觀察程序斷點處的變量取值.不斷縮小可疑代碼的搜索范圍,直至定位到缺陷代碼.這種方法完全通過人工的方式完成,存在缺陷定位代價高、對缺陷報告信息利用不充分、費(fèi)時費(fèi)力等問題.因此,研究人員針對自動化軟件缺陷定位方法展開了深入研究,試圖在減輕開發(fā)人員負(fù)擔(dān)的同時,提高缺陷定位的效率與精度.

      已有的缺陷定位方法按照是否需要執(zhí)行測試用例,可分為兩類:動態(tài)缺陷定位方法和靜態(tài)缺陷定位方法[1].其中:動態(tài)缺陷定位方法通過搜集測試用例的執(zhí)行行為和運(yùn)行結(jié)果,重點對被測程序的內(nèi)在結(jié)構(gòu)進(jìn)行分析,以確定缺陷語句在被測程序內(nèi)的可能位置;靜態(tài)缺陷定位方法通過分析缺陷報告和程序模塊的文本內(nèi)容并提取特征,基于特定模型確定可疑的程序模塊,并將其推薦給開發(fā)人員以輔助定位.動態(tài)缺陷定位方法基于測試用例的覆蓋信息定位缺陷,通??色@得比靜態(tài)缺陷定位方法更好的性能[2].然而在軟件維護(hù)階段,開發(fā)人員有時并不能獲得足夠的測試用例[3],僅能搜集到缺陷報告的信息.靜態(tài)缺陷定位方法由于不需要搜集測試用例的執(zhí)行信息,不會受到程序規(guī)模和編程語言等因素的影響,具有缺陷定位代價低和方法可擴(kuò)展性強(qiáng)等特點,也頗受關(guān)注.其中,基于信息檢索的缺陷定位(information retrieval-based bug localization,簡稱IRBL)是目前靜態(tài)缺陷定位研究中的熱點,也是本綜述重點關(guān)注的研究問題.

      IRBL 可視為概念定位(concern localization)[4]或特征定位(feature localization)[5]的一個特例.當(dāng)需要定位的概念或特征都為缺陷時,概念定位或特征定位又被稱為缺陷定位.IRBL 輸入為一個缺陷報告,輸出為所有與該缺陷報告所述缺陷相關(guān)的程序模塊.該問題在研究時面臨缺陷報告和程序模塊詞匯不匹配和表示方式差異較大等問題,大部分研究人員從文本挖掘角度設(shè)計解決方案.為了對該研究問題進(jìn)行系統(tǒng)的分析、總結(jié)和比較,我們首先在IEEE Explore、ACM Digital Library、Elsevier、Springer、CNKI 等學(xué)術(shù)論文數(shù)據(jù)庫中進(jìn)行檢索,檢索時采用的英文關(guān)鍵詞包括bug localization、fault localization、information retrieval、bug localisation 等;然后,通過人工審查的方式移除掉與綜述主題無關(guān)的論文,并通過查閱相關(guān)論文的參考文獻(xiàn)和相關(guān)研究人員發(fā)表的論文列表來進(jìn)一步識別出遺漏的論文;最終,我們篩選出與該研究問題直接相關(guān)的高質(zhì)量論文共87 篇(截止到2019 年12 月).

      我們首先對每年發(fā)表的相關(guān)論文的累計總數(shù)進(jìn)行統(tǒng)計,結(jié)果如圖1 所示.不難看出,每年發(fā)表的論文數(shù)整體上呈上升趨勢.在2013 年之前,每年發(fā)表的論文數(shù)較少(介于0 至4 篇).但在2013 年之后,隨著公開的數(shù)據(jù)集和共享的實驗代碼的不斷增多,針對IRBL 方法的研究逐漸成為靜態(tài)軟件缺陷定位領(lǐng)域內(nèi)的一個主流研究方向.在最近3 年,每年發(fā)表的論文總數(shù)平均可以達(dá)到13 篇以上.

      Fig.1 Statistics of annual cumulative number of papers on IRBL圖1 IRBL 每年累計發(fā)表論文數(shù)的統(tǒng)計

      隨后,我們基于論文發(fā)表源對相關(guān)論文進(jìn)行分類,并按照論文數(shù)從大到小進(jìn)行排序,最終結(jié)果如表1 所示(該表僅列出CCF 推薦列表中論文數(shù)大于1 的會議和期刊),其中,在軟件工程領(lǐng)域權(quán)威期刊或會議上發(fā)表的論文數(shù)總結(jié)如下:ICSE 會議(5 篇)、ESEC/FSE 會議(4 篇)、ISSTA 會議(3 篇)、ISSRE 會議(2 篇)、TSE 期刊(5 篇)等.基于已搜索到的相關(guān)論文,我們對IRBL 方法的已有研究工作進(jìn)行了系統(tǒng)總結(jié),并提出一個研究框架,從3 個影響因素出發(fā),對不同類型的方法進(jìn)行系統(tǒng)的分析和比較,同時對常用的性能評測指標(biāo)和評測數(shù)據(jù)集進(jìn)行歸納.

      Table 1 Statistics of the publication sources of papers on IRBL表1 針對IRBL 論文的發(fā)表源統(tǒng)計

      本文第1 節(jié)總結(jié)IRBL 方法的研究框架,并識別出3 個重要的影響因素(數(shù)據(jù)源、檢索模型和場景應(yīng)用).第2 節(jié)~第4 節(jié)分別對這3 個影響因素進(jìn)行詳細(xì)的分析與總結(jié).第5 節(jié)介紹常用的性能評測指標(biāo).第6 節(jié)介紹常用的評測數(shù)據(jù)集.最后總結(jié)全文并對未來可能值得關(guān)注的研究問題進(jìn)行展望.

      1 研究框架

      IRBL 方法針對一個缺陷報告,嘗試定位到可能包含缺陷的程序模塊(其模塊粒度根據(jù)實際定位需求可以設(shè)置為文件、類或方法等).其輸入為缺陷報告和所有候選程序模塊,通過建立程序模塊語料庫、建立索引、構(gòu)建查詢、檢索和排序,推薦給開發(fā)人員一個有序列表(在該有序列表內(nèi),程序模塊按照含有缺陷的可能性從高到低進(jìn)行排序).

      在缺陷定位過程中,一個典型的缺陷報告如圖2(a)所示,該缺陷報告來自軟件項目AspectJ.缺陷報告一般包含標(biāo)題(title)、描述(description)、評論(comment)、產(chǎn)品(product)、組件(component)、版本號(version)和報告提交時間等信息,其對應(yīng)的缺陷程序模塊是LazyTransfer.java 和RTFTransfer.java 文件(如圖2(b)所示).缺陷報告中的標(biāo)題總結(jié)缺陷問題,描述給出缺陷的癥狀以及觸發(fā)缺陷的行為等,評論則包含評論者的反饋信息等.這些文本通常涉及缺陷代碼中的詞或片段,提供缺陷定位所需的大部分信息.然而總存在一些低質(zhì)量的缺陷報告,其描述內(nèi)容不清晰,甚至不包含評論內(nèi)容.對于圖 2(a)中缺陷報告而言,在評論中涉及到了缺陷程序模塊的類名RTFTransfer,這對缺陷的定位和驗證起重要作用,在沒有評論時,將無法提供足夠的信息來進(jìn)行缺陷定位,此時,這類缺陷報告需要使用其他額外信息來定位缺陷程序模塊.在基于各類缺陷報告進(jìn)行缺陷定位時,其典型研究框架如圖3 所示.

      圖3 的上半部分總結(jié)IRBL 的過程,該過程主要包括兩個階段:模型構(gòu)建階段和模型應(yīng)用階段.具體來說,模型構(gòu)建階段包括兩個步驟.

      (1) 挖掘缺陷跟蹤系統(tǒng)、版本控制系統(tǒng)、API 文檔等數(shù)據(jù)源,從中搜集缺陷報告、程序模塊和提交日志等信息,建立缺陷報告與程序模塊的關(guān)聯(lián),構(gòu)建出缺陷定位數(shù)據(jù)集;同時,IRBL 的輸入也由所搜集的數(shù)據(jù)源信息決定.

      (2) 設(shè)計出衡量缺陷報告與程序模塊相關(guān)度的特征,分析程序模塊含有缺陷的概率,借助這些特征構(gòu)建出缺陷定位模型,即IRBL 模型.

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

      Fig.3 Research framework of IRBL圖3 IRBL 的研究框架

      在模型應(yīng)用階段,當(dāng)處理一個新的缺陷報告時,基于前一階段流程提取特征,并應(yīng)用訓(xùn)練好的缺陷定位模型完成對該缺陷報告的定位,將缺陷程序模塊的有序列表推薦給開發(fā)人員.

      根據(jù)缺陷定位應(yīng)用場景的不同需求,其缺陷定位粒度和結(jié)果不同,需要的輸入信息、特征提取方式和檢索過程都會稍有不同,最后輸出不同的有序列表.

      通過分析上述軟件缺陷定位過程,我們識別出影響缺陷定位性能的3 個重要因素(如圖3 的下半部分所示).

      (1) 數(shù)據(jù)源.對開發(fā)人員而言,除可獲得缺陷報告信息和程序模塊代碼之外,還可挖掘出軟件的版本歷史信息和程序模塊的變更信息等,IRBL 方法的輸入決定了在缺陷定位過程中所能包含信息的上限,從更多信息角度構(gòu)建出與缺陷報告所述軟件缺陷存在強(qiáng)相關(guān)性的特征,這是構(gòu)建高質(zhì)量缺陷定位模型的關(guān)鍵.

      (2) 檢索模型.IRBL 檢索模型主要基于詞法和語義角度進(jìn)行檢索,因此,本文將已有的檢索模型方法分為兩類:基于文本相似度的方法和基于語義相似度的方法.

      (3) 場景應(yīng)用.針對不同場景,不同開發(fā)人員的定位需求不同,因此對缺陷定位粒度和返回結(jié)果的要求也各不相同.本文將缺陷定位的應(yīng)用場景按其定位粒度劃分為4 類:基于文件的缺陷定位、基于函數(shù)的缺陷定位、基于語句的缺陷定位和基于代碼變更(code change)的缺陷定位.

      2 數(shù)據(jù)源的分析

      如何從缺陷跟蹤系統(tǒng)和版本控制系統(tǒng)中挖掘出與缺陷報告所述軟件缺陷存在強(qiáng)相關(guān)性的信息,是構(gòu)建高質(zhì)量缺陷定位模型的關(guān)鍵.早期的研究工作主要集中于分析缺陷報告的內(nèi)容,重點關(guān)注缺陷報告的總結(jié)和描述內(nèi)容,挖掘程序模塊與缺陷報告之間的相關(guān)性.但存在部分缺陷報告本身只包含少量信息的情況,導(dǎo)致缺陷定位性能降低.近些年來,許多研究工作開始集中于從其他信息源角度挖掘與缺陷程序模塊相關(guān)的信息,并設(shè)計出合適的特征,這些特征主要從缺陷報告與程序模塊的相關(guān)性以及程序模塊本身的缺陷概率兩個方面來衡量,不同的輸入信息也是圍繞這兩個方面進(jìn)行考慮.本節(jié)將重點從這個角度對已有研究工作進(jìn)行系統(tǒng)的總結(jié),首先不同的數(shù)據(jù)源可劃分為3 類:(1) 缺陷報告和程序模塊;(2) 項目元數(shù)據(jù);(3) 測試用例的執(zhí)行信息.

      從缺陷跟蹤系統(tǒng)中可挖掘出缺陷報告信息,從版本控制系統(tǒng)(例如Git、CSV 或SVN 等)中可挖掘出程序模塊代碼和項目元數(shù)據(jù)(即版本歷史信息和代碼變更信息等).測試用例的執(zhí)行信息通過對項目運(yùn)行多個測試用例生成并獲取.缺陷報告和程序模塊作為IRBL 的主體,是必不可少的.在已公開數(shù)據(jù)集中,大部分?jǐn)?shù)據(jù)集僅提供缺陷報告和程序模塊代碼,項目元數(shù)據(jù)和測試用例的執(zhí)行信息需額外獲取.

      2.1 缺陷報告和程序模塊

      在IRBL 研究的早期階段,大部分研究工作僅通過分析缺陷報告和程序模塊代碼來定位可能包含缺陷的程序模塊.在以缺陷報告和程序模塊作為輸入時,如圖2 中所示,缺陷報告包含總結(jié)、描述、元數(shù)據(jù)(版本、平臺、操作系統(tǒng)、缺陷嚴(yán)重程度和匯報者)和評論,程序模塊包含注釋、標(biāo)識符和字符串字面值等信息.大部分IRBL方法并不會使用全部的信息,通常被使用到的是缺陷報告中的總結(jié)和描述以及程序模塊中的標(biāo)識符和注釋.對于缺陷報告和程序模塊的文本內(nèi)容,首先要進(jìn)行預(yù)處理.除此之外,會根據(jù)缺陷報告中是否包含特殊文本(如堆棧跟蹤(stack trace)以及文件名等)進(jìn)行特殊處理.該小節(jié)首先介紹預(yù)處理過程,然后從缺陷報告與程序模塊相關(guān)性以及程序模塊缺陷概率這兩個角度對已有方法進(jìn)行總結(jié).

      2.1.1 預(yù)處理過程

      原始的缺陷報告和程序模塊文本具有很多噪音詞匯及數(shù)據(jù).早期的IRBL 方法就已經(jīng)開始針對缺陷報告和程序模塊的文本執(zhí)行數(shù)據(jù)預(yù)處理,以達(dá)到減少噪音和提高缺陷定位性能的目的.數(shù)據(jù)預(yù)處理過程主要包括文本標(biāo)準(zhǔn)化(text normalization)、停用詞(stopword)移除以及詞干提取(stemming)這3 步.

      · 文本標(biāo)準(zhǔn)化:首先從文檔中移除特殊字符和標(biāo)點符號等單詞,隨后將文檔切分成不連續(xù)的單詞,對于源代碼中的標(biāo)識符,還需依據(jù)駝峰式分割法(camel case splitting)來進(jìn)一步切分為更小的單詞.例如,標(biāo)識符“processFile”可以被切分為單詞“process”和“file”.

      · 停用詞移除:針對標(biāo)準(zhǔn)化的文檔,借助英文中的常用停用詞進(jìn)行移除.停用詞是指在各個文檔中頻繁出現(xiàn),但在區(qū)分不同文檔時作用極小的單詞,如“a”“on”等單詞.對程序模塊而言,需移除程序語言相關(guān)的停用詞,如“int”“private”等.

      · 詞干提取:將單詞轉(zhuǎn)換成對應(yīng)的詞干形式.例如,單詞“l(fā)ocalized”“l(fā)ocalization”“l(fā)ocalize”和“l(fā)ocally”都可還原為詞干“l(fā)ocal”.

      許多研究人員同時采用這3 步預(yù)處理過程,這些過程對減小缺陷報告和程序模塊的詞匯差異性有顯著幫助.Thomas 等人[6]和Tantithamthavorn 等人[7]在探索分類器配置對缺陷定位性能影響時,對3 步預(yù)處理過程進(jìn)行排列組合,并最終形成8 種預(yù)處理方式.實驗結(jié)果表明:對所有的實驗項目和檢索模型而言,同時使用3 步預(yù)處理過程的檢索結(jié)果相較于使用其他排列組合方式的結(jié)果始終是最優(yōu)的.Hill 等人[8]則對詞干提取在缺陷定位(或概念定位)中的影響進(jìn)行了研究,比較了5 種詞干提取器(stemmer):Porter、Snowball、Kstem、Paice 和Mstem.結(jié)果表明:不同的詞干提取方法對長缺陷報告的影響較小,對短缺陷報告的影響則較大.其原因為:短缺陷報告的文本組織更加接近自然語言,而長缺陷報告的文本則通常會包含代碼片段.

      2.1.2 缺陷報告與程序模塊相關(guān)性

      缺陷報告與程序模塊的相關(guān)性度量主要從文本信息、堆棧跟蹤、相似缺陷報告這3 個角度出發(fā).

      (1) 文本信息

      這類信息的常見輸入是缺陷報告的總結(jié)和描述以及程序模塊的文本內(nèi)容,可采用文本檢索方法直接計算出缺陷報告和程序模塊之間的相關(guān)性,也可基于語義模型計算出缺陷報告和程序模塊的相關(guān)性.

      早期,Lukins 等人[9,10]從指定粒度的程序模塊(可以是包、類或方法等)提取代碼中的注釋和標(biāo)識符以形成文檔集,缺陷報告僅使用描述部分的內(nèi)容,通過LDA(latent dirichlet allocation)檢索模型查詢與缺陷報告相關(guān)聯(lián)的程序模塊.Nguyen 等人[11]則使用缺陷報告的總結(jié)和描述內(nèi)容作為查詢,提取程序模塊的注釋和標(biāo)識符形成對應(yīng)的文檔集.他們改進(jìn)了主題模型LDA,分別對缺陷報告和程序模塊應(yīng)用主題模型,并且訓(xùn)練集中缺陷報告的主題還受其對應(yīng)的缺陷程序模塊的主題分布參數(shù)影響,即它們共享相似的主題分布參數(shù),訓(xùn)練好模型后,將其應(yīng)用到新的缺陷報告上.Lal 等人[12]則考慮從字符級別的n-gram 模型出發(fā)進(jìn)行信息檢索,不局限于單詞.從字符角度考慮,具有可匹配拼寫錯誤的單詞、可匹配縮寫詞等優(yōu)點,因此具有更高的魯棒性.該方法使用的輸入為缺陷報告的標(biāo)題和描述以及程序模塊的文件名和文件路徑名,兩兩組合計算相似度,n-gram 模型的字符設(shè)置長度從3增長到10.結(jié)果表明:字符級別的n-gram 方法是有效的,且描述與文件名的組合相較于其他3 個組合具有更高的預(yù)測性能.Zhang 等人[13]發(fā)現(xiàn),缺陷報告中的元數(shù)據(jù)(組件和版本信息等)被多數(shù)IRBL 方法忽略,因此提出一個修正的主題模型L2SS+,并考慮了缺陷報告元數(shù)據(jù).該方法假設(shè)缺陷報告的不同元數(shù)據(jù)項有不同的主題分布,將不同的主題分布累加起來作為缺陷報告的主題分布,然后計算缺陷報告和程序模塊的關(guān)聯(lián)度.實驗結(jié)果表明,使用元數(shù)據(jù)信息能有效提高缺陷定位性能.Khatiwada 等人[14]從信息理論的角度分析和建立缺陷報告和程序模塊之間的關(guān)聯(lián),通過詞與詞之間的聯(lián)系捕捉文檔間的語義信息.他們采用點間互信息 PMI(pointwise mutual information)和規(guī)范化google 距離NGD(normalized google distance).其中,PMI 度量兩個詞間的信息重疊或統(tǒng)計依賴程度,NGD 基于信息距離和Kolmogorov 復(fù)雜度來衡量詞之間的語義相關(guān)度.隨后,該方法基于PMI 或NGD將詞之間的關(guān)聯(lián)拓展到文檔之間的關(guān)聯(lián).實驗結(jié)果表明,該方法要優(yōu)于VSM 和LSI 等通用文本模型.

      使用文本信息來進(jìn)行缺陷定位,依賴于缺陷報告和程序模塊之間的共享詞匯.Moreno 等人[15]對此進(jìn)行了分析,他們發(fā)現(xiàn):缺陷報告和軟件系統(tǒng)中的大部分類文件都共享部分詞匯,平均而言,與打補(bǔ)丁的類(即缺陷類)有更多共享詞.缺陷類各部位按照與缺陷報告共享詞的數(shù)量從大到小排序的結(jié)果為:注釋(26.98%)、函數(shù)調(diào)用(20.28%)和類型名(12.69%)等,而各部位共享詞的比率從大到小排序的結(jié)果為:類名(53.57%)、字符串面值(21.40%)和類型名(20.69%)等.他們還發(fā)現(xiàn),用共享詞的數(shù)量定義相關(guān)性有時比一些文本檢索方法定位更準(zhǔn)確.可以看出:在這類基于文本信息進(jìn)行檢索的IRBL 方法中,缺陷報告的質(zhì)量會直接影響到缺陷定位的性能.

      (2) 相似缺陷報告

      在缺陷跟蹤系統(tǒng)中,存在重復(fù)或相似的缺陷報告[16].有研究人員假設(shè):如果兩個缺陷報告的文本相似度很高,則這兩個缺陷報告很可能對應(yīng)相同的缺陷程序模塊.因此,可從已修復(fù)的缺陷報告中搜索出與當(dāng)前缺陷報告相似的缺陷報告.相似缺陷報告評分作為增強(qiáng)缺陷報告與缺陷程序模塊相關(guān)性的評分,被多個方法使用.

      Davies 等人[17]基于缺陷報告間的相似度,增強(qiáng)缺陷定位缺陷性能.他們?yōu)槌绦蚰K中的每個函數(shù)訓(xùn)練一個二分類決策樹,其輸入是基于缺陷報告描述生成的詞向量,類標(biāo)簽表示缺陷報告是否與函數(shù)相關(guān).當(dāng)新的缺陷報告被提交后,每個分類器按順序來預(yù)測標(biāo)簽.Zhou 等人[18]基于相似缺陷報告的假設(shè),對相似缺陷報告的缺陷程序模塊給一個基于缺陷報告間相似度的評分,并且考慮到程序模塊的代碼長度問題,采用了修正的VSM(vector space model),相較于直接利用VSM 和LDA 等文本檢索模型的計算方法,缺陷定位性能有了顯著提升.

      (3) 堆棧跟蹤

      缺陷報告的質(zhì)量有高有低,有時缺陷報告中會包含程序執(zhí)行失敗后的堆棧跟蹤信息.當(dāng)缺陷報告包含堆棧跟蹤信息時,開發(fā)人員首先檢查堆棧跟蹤中涉及到的程序模塊來進(jìn)行缺陷定位.Schroter 等人[19]發(fā)現(xiàn),幾乎60%的帶堆棧跟蹤的缺陷報告都可以通過修改堆棧跟蹤記錄中的函數(shù)來修復(fù).其中,大概有40%的缺陷函數(shù)可以在堆棧跟蹤的第1 幀中發(fā)現(xiàn),90%的缺陷函數(shù)可以在前10 幀中發(fā)現(xiàn).通過使用堆棧跟蹤這一額外的輸入信息,可以有效提高缺陷定位的性能,這類信息通常也被用來作為計算缺陷報告和程序模塊相關(guān)性的補(bǔ)充.

      其中,shortestPath(d,cj)表示程序模塊d與程序模塊cj的最短距離,dist(stackTrace,cj)衡量程序模塊cj與堆棧跟蹤中所有程序模塊的最短距離,ScoreST(ri,cj)衡量缺陷報告ri中的堆棧跟蹤與程序模塊cj的相關(guān)性評分.

      Wong 等人[21]采取了和文獻(xiàn)[20]類似的操作,將文本相似度和堆棧跟蹤相似度相結(jié)合.他們發(fā)現(xiàn)了當(dāng)前缺陷定位方法尚未解決的兩個問題:大文件的噪音問題以及堆棧跟蹤信息未使用的問題.他們針對性地將程序模塊代碼進(jìn)行等長分割,比較缺陷報告和分割后的代碼文本相似度以過濾噪音;而對堆棧跟蹤信息的利用,則是通過對堆棧跟蹤中出現(xiàn)的所有程序模塊賦予一個缺陷模塊增強(qiáng)評分,其計算公式如下.

      其中,rankcj表示程序模塊cj在堆棧跟蹤中的排名,Dtrace表示堆棧跟蹤中的程序模塊形成的集合,Dimport表示堆棧跟蹤中的程序模塊所調(diào)用的程序模塊形成的集合.該方法對堆棧跟蹤中的程序模塊以及其程序模塊所調(diào)用的模塊依據(jù)其排名給出增強(qiáng)評分.

      2.1.3 程序模塊缺陷概率

      程序模塊自身因其代碼規(guī)模或復(fù)雜度不同,其內(nèi)部含有缺陷的概率也不同[22].有研究人員考慮從缺陷程序模塊特性出發(fā),從程序模塊中挖掘出更多信息.

      (1) 程序模塊調(diào)用關(guān)系

      Ye 等人[23]認(rèn)為,復(fù)雜的代碼比簡單代碼更容易引入缺陷.他們從句法特征的角度衡量代碼的復(fù)雜度:(1) 程序模塊復(fù)雜度隨著它使用的類的數(shù)目的增多而增加;(2) 程序模塊復(fù)雜度不僅依賴于它依賴文件的數(shù)目,也取決于每個依賴文件的復(fù)雜度;(3) 程序模塊感知復(fù)雜度隨使用次數(shù)增多而降低.基于這些觀察,Ye 等人基于程序模塊調(diào)用關(guān)系構(gòu)建一個程序模塊依賴圖,使用PageRank 和HITS(hyperlink-induced topic search)等基于連接查找關(guān)鍵信息節(jié)點的算法分析復(fù)雜缺陷程序模塊,以定位缺陷.Zhou 等人[24]從詞性和程序模塊調(diào)用的角度來增強(qiáng)缺陷定位的性能.他們分析缺陷報告詞匯的詞性,提高名詞的權(quán)重;同時,考慮缺陷報告中的類名,將類名對應(yīng)的文件定義為命中文件,選擇相似度評分最高的命中文件,提高其調(diào)用文件的評分.Chen 等人[25]沒有直接利用程序模塊間的調(diào)用關(guān)系,他們基于缺陷報告將程序模塊建模成一個社交網(wǎng)絡(luò),進(jìn)行隱連接分析.該方法基于假設(shè):如果一個缺陷報告與兩個程序模塊相關(guān),則這兩個程序模塊存在一個共引用關(guān)系(co-cited relationship),可構(gòu)建隱式雙向連接.通過分析所有歷史缺陷報告可以構(gòu)建出社交網(wǎng)絡(luò)圖,該方法基于改進(jìn)的PageRank 算法可估算每個程序模塊的評分.當(dāng)遇到一個新的缺陷報告時,計算缺陷報告與歷史缺陷報告的相似度,由其對應(yīng)的缺陷程序模塊評分得出.

      (2) 代碼異味(code smell)

      教學(xué)改革研究項目管理系統(tǒng)的實現(xiàn) 系統(tǒng)采用Java語言,以J2EE技術(shù)為基礎(chǔ),采用目前應(yīng)用較為廣泛的SSH Web框架,運(yùn)用Struts+Spring+Hibernate技術(shù)搭建表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層和域模塊層,建立結(jié)構(gòu)清晰、可復(fù)用性好、維護(hù)方便的Web應(yīng)用程序。

      代碼異味指那些在源代碼中很可能引發(fā)深層問題的特征,如出現(xiàn)重復(fù)代碼、過長函數(shù)、過大的類、過長參數(shù)列表等情況.代碼異味檢測將源代碼作為輸入,生成包含代碼異味的程序模塊列表及其異味類型或嚴(yán)重程度.

      Takahashi 等人[26]對使用代碼異味來提高缺陷定位性能進(jìn)行了初步研究,他們將缺陷報告和程序模塊的文本相似度以及代碼異味嚴(yán)重程度進(jìn)行線性擬合來定位缺陷.實驗結(jié)果表明,代碼異味在函數(shù)和類級別定位上都能顯著提高缺陷定位的性能.

      2.2 項目元數(shù)據(jù)

      除了從缺陷報告和程序模塊角度進(jìn)行挖掘,開發(fā)人員可從版本控制系統(tǒng)中獲取軟件代碼的變更歷史信息,這類信息主要輸入包括從Git,CVS,SVN 等版本控制系統(tǒng)中抽取的項目元數(shù)據(jù)(metadata).其中,項目元數(shù)據(jù)指從版本控制系統(tǒng)中可直接獲取的項目文件修改信息、歷史變更記錄或提交日志(commit log)等.通過分析日志等信息,研究人員可以獲得程序模塊的歷史修改次數(shù)、程序模塊的缺陷修復(fù)次數(shù)、程序模塊上一次缺陷修復(fù)時間、一次缺陷修復(fù)提交中被修改的所有文件等信息.經(jīng)研究人員觀察發(fā)現(xiàn):如果一個文件在最近的版本中被修改或?qū)崿F(xiàn)某個新增功能,它有很大的概率會引入缺陷.這類信息從程序模塊缺陷概率的角度提供額外信息.

      Sisman 等人[27]首次使用版本信息來估計程序模塊的先驗缺陷概率,用于缺陷定位.他們基于缺陷預(yù)測的已有研究工作,認(rèn)為文件修改歷史和文件缺陷歷史是比較好的文件潛在缺陷預(yù)測特征.因此,他們定義了修改歷史先驗(modification history based prior,簡稱MHbP)和缺陷歷史先驗(defect history based prior,簡稱DHbP)兩個指標(biāo),其計算公式如下.

      其中,

      ·Ck表示第k次變更后的程序模塊集合.

      ·Sk表示第k次變更修改的程序模塊集合.

      · 函數(shù)Im(f,si)指文件f是否在第si次變更中被修改:被修改則為1,否則為0.

      ·PMHbP(f|Ck,Sk)統(tǒng)計的是文件f的修改總次數(shù)占所有文件修改次數(shù)的比率.

      ·PDHbP(f|Ck,Sk)與之類似,統(tǒng)計的是該文件的缺陷修復(fù)次數(shù)占所有文件缺陷修復(fù)次數(shù)的比率.

      Tantithamthavorn 等人[28]使用聯(lián)合變更歷史來增強(qiáng)BugLocator 方法[18]的缺陷定位性能.其中,聯(lián)合變更是指在開發(fā)人員的一次代碼提交中存在多個程序模塊被修改變更的現(xiàn)象.他們利用一個假設(shè):如果一個缺陷模塊被修復(fù),那些與缺陷模塊同時被修改的程序模塊也需要被修復(fù).該方法為所有程序模塊創(chuàng)建一個交互矩陣,記錄之前程序模塊被一起修改的次數(shù),在將交互矩陣標(biāo)準(zhǔn)化后,選取與BugLocator 排序結(jié)果中前k個程序模塊關(guān)聯(lián)的并且大于某個閾值的程序模塊作為缺陷程序模塊,同時推薦給開發(fā)人員.

      Wang 等人[29]同樣利用缺陷預(yù)測領(lǐng)域的研究成果,對程序模塊依據(jù)與之相關(guān)的缺陷修復(fù)提交的個數(shù)進(jìn)行排序(即程序模塊缺陷修復(fù)歷史).經(jīng)驗表明:過早的缺陷修復(fù)提交因時間原因?qū)ψ钚碌娜毕荻ㄎ挥绊懖淮?甚至?xí)档腿毕荻ㄎ恍阅?他們因此修改Google 開發(fā)人員提出的缺陷預(yù)測算法,搜集包含“fix”或“bug”的提交,并限制這些提交在缺陷報告提交時間的k天以內(nèi);隨后賦予與提交相關(guān)的程序模塊一個懷疑率評分,其計算公式如下.

      其中,FS為缺陷相關(guān)提交的集合,tc′為提交c′和輸入缺陷報告提交時間的相隔天數(shù).

      2.3 測試用例的執(zhí)行信息

      開發(fā)人員可執(zhí)行多個測試用例,分析測試用例的覆蓋信息和執(zhí)行結(jié)果,搜集頻譜(spectrum)信息和切片(slicing)信息等.其中:頻譜信息描述失敗測試用例和成功測試用例執(zhí)行的覆蓋比例,可計算每個執(zhí)行類或函數(shù)的可疑評分;程序切片描述影響某個程序點狀態(tài)的所有類或函數(shù),在測試用例失敗時,只有對失敗點有影響的表達(dá)式可能包含缺陷.這些測試用例的執(zhí)行信息常用于動態(tài)缺陷定位[30],可衡量程序模塊的缺陷概率.

      Le 等人[31]利用頻譜信息和文本信息,提出一種多模態(tài)方法,并定義了3 類特征:基于本文的特征、基于頻譜的特征和基于可疑詞的特征.具體來說:文本特征考慮缺陷報告和程序模塊的文本相似度,頻譜特征僅考慮使用基于頻譜的缺陷定位技術(shù)來計算相關(guān)度,基于可疑詞的特征則根據(jù)單詞出現(xiàn)在執(zhí)行失敗的函數(shù)中的次數(shù)占單詞出現(xiàn)在所有函數(shù)中次數(shù)的比例計算.這3 類特征通過一個線性整合器進(jìn)行擬合,并采用邏輯回歸進(jìn)行優(yōu)化.Hoang 等人[32]在Le 等人[31]工作的基礎(chǔ)上提出了基于網(wǎng)絡(luò)聚類的多模態(tài)缺陷定位方法,采用聯(lián)合優(yōu)化的方式.該方法同時考慮上述3 類特征以及缺陷報告之間和程序模塊之間構(gòu)建的關(guān)系圖,損失函數(shù)由相似缺報告和相似程序模塊的聚類損失、缺陷定位的誤差損失組成.

      Dao 等人[33]則研究了頻譜信息、切片信息和覆蓋信息對IRBL 方法的影響,他們比較了4 類結(jié)合方式:覆蓋信息與IRBL 相結(jié)合、切片信息與IRBL 相結(jié)合、覆蓋信息和頻譜信息與IRBL 相結(jié)合、切片信息和頻譜信息與IRBL 相結(jié)合.覆蓋信息和切片信息可用來優(yōu)化搜索空間,過濾掉失敗測試用例沒有執(zhí)行到的程序?qū)嶓w;頻譜信息可用來計算每個實體的懷疑率評分,并對排序進(jìn)行調(diào)整.實驗結(jié)果表明:通過覆蓋信息和切片信息來優(yōu)化排序列表,能有效提高缺陷定位準(zhǔn)確率,頻譜信息能更進(jìn)一步提高函數(shù)級別的缺陷定位性能.

      2.4 不同數(shù)據(jù)源的分析

      表2 對IRBL 方法使用的數(shù)據(jù)源信息進(jìn)行了統(tǒng)計,根據(jù)該表我們發(fā)現(xiàn):缺陷報告和程序模塊作為IRBL 方法的必要輸入,對每個IRBL 方法都不可或缺,因此涉及的論文數(shù)最多.其他數(shù)據(jù)源涉及的論文數(shù)則明顯偏少.研究人員主要從程序模塊和缺陷報告的相關(guān)性考慮,挖掘多種信息,僅有少數(shù)方法考慮從程序模塊缺陷概率的角度出發(fā).在缺陷報告和程序模塊相關(guān)性度量中,從文獻(xiàn)[18,21]的參數(shù)設(shè)置比例我們發(fā)現(xiàn):對IRBL 方法而言,基于文本信息計算的相關(guān)度的權(quán)重顯著大于基于相似缺陷報告和堆棧跟蹤計算的相關(guān)度的權(quán)重,基于文本信息計算的相關(guān)度起決定作用,后兩者起著優(yōu)化作用.將缺陷報告與程序模塊相關(guān)性和程序模塊缺陷概率相比時,缺陷報告與程序模塊相關(guān)性起主要作用,程序模塊缺陷概率起次要作用[34].為此,有許多研究人員直接考慮從缺陷報告和程序模塊的文本內(nèi)容出發(fā),關(guān)注于提升缺陷報告和缺陷程序模塊的關(guān)聯(lián)度,著重解決缺陷報告和程序模塊的詞匯不匹配問題.

      Table 2 Statistics of data sources表2 數(shù)據(jù)源統(tǒng)計

      3 檢索模型

      為了解決缺陷報告和缺陷程序模塊的不匹配問題,IRBL 檢索模型從基于詞法的模型發(fā)展到基于語義的模型,參數(shù)優(yōu)化方式從簡單的啟發(fā)式方法發(fā)展到基于學(xué)習(xí)的優(yōu)化方法.IRBL 檢索模型發(fā)展依時間層次遞進(jìn),可分為基于文本相似度的方法和基于語義相似度的方法,下面將依次介紹這些方法.

      3.1 基于文本相似度的方法

      3.1.1 基于通用檢索模型的方法

      這類方法主要依賴缺陷報告和程序模塊間詞的相似度,將缺陷報告視為查詢,將程序模塊視為語料庫,進(jìn)行文本檢索.經(jīng)典的文本檢索模型都可應(yīng)用于IRBL.目前,在IRBL 中被使用的經(jīng)典模型有向量空間模型VSM、主題模型和概率檢索模型等.

      (1) 向量空間模型(VSM)

      VSM 基于詞袋模型,將缺陷報告和程序模塊表示為對應(yīng)的向量,根據(jù)TF(term frequency)和IDF(inverse document frequency)計算方式的不同可有多個變種,隨后通過計算向量間的余弦相似度來衡量缺陷報告和程序模塊間的相似性.

      Wang 等人[35]根據(jù)5 種TF 計算方式和3 種IDF 計算方式形成15 種VSM 變種,他們將15 種VSM 相似度評分通過線性相加進(jìn)行組合建模,隨后使用遺傳算法來自動優(yōu)化參數(shù)取值.實驗結(jié)果表明:通過組合優(yōu)化的方式,該方法的缺陷定位性能要顯著優(yōu)于標(biāo)準(zhǔn)的VSM 模型.Gore 等人[36]將N-Gram 模型與VSM 相結(jié)合,提出了混合檢索模型.常用的VSM 模型只考慮單個詞,詞之間互相獨立(即詞袋模型),詞組信息缺失.該方法同時采用一元模型(unigram model)和二元模型(bigram model),并分別基于rVSM[18]計算兩種相似度,最后加權(quán)求和.與傳統(tǒng)方法相比,該混合模型缺陷定位性能有顯著提升.

      (2) 主題模型

      IRBL 中使用的主題模型有潛在語義分析(latent semantic analysis,簡稱LSA 或latent semantic index,簡稱LSI)和隱含狄利克雷分布LDA:LSA 采用奇異值分解(singular value decomposition)將VSM 模型所表示的向量降維,形成一個降維后的K維向量表示,隨后通過計算余弦相似度來衡量缺陷報告和程序模塊間的相似性;LDA假設(shè)缺陷報告和程序模塊都是由某些主題生成,因此缺陷報告和程序模塊的相似度可基于主題分布來計算.

      Lukins 等人[9,10]提出了基于LDA 的缺陷定位方法,并與LSI 模型進(jìn)行比較,結(jié)果表明,LDA 模型的定位性能更好.Wang 等人[37]發(fā)現(xiàn):(1) 有監(jiān)督模型能有效利用現(xiàn)存的修復(fù)歷史信息;(2) 缺陷報告中某些單詞多次出現(xiàn)在相關(guān)缺陷模塊中(即詞共現(xiàn)現(xiàn)象);(3) 大的程序模塊傾向于含有更多的缺陷(即長文件現(xiàn)象).基于上述發(fā)現(xiàn),他們提出一種有監(jiān)督主題模型STMLOCATOR.該方法改進(jìn)了有監(jiān)督主題模型LLDA[38]方法,對詞共現(xiàn)現(xiàn)象和長文件現(xiàn)象進(jìn)行建模.單詞w可由缺陷報告和程序模塊中的共現(xiàn)詞或主題-詞分布生成,他們設(shè)置主題數(shù)為程序模塊的個數(shù),引入一個非對稱的Dirichlet prior 來表示選擇不同主題的不同概率.當(dāng)一個文件規(guī)模比較大的時候,其被選中的概率更高.

      (3) 概率檢索模型

      IRBL 中使用的概率模型包括SUM(smoothed unigram model)和BM25[39].

      · SUM 將每個程序模塊和缺陷報告表示為一個|V|維的概率向量,可通過KL 散度計算出程序模塊和缺陷報告的分布差異,并以此作為相似度指標(biāo);也可用程序模塊和缺陷報告的生成概率表示,其中,分別是缺陷報告和程序模塊的向量表示.

      · BM25 基于缺陷報告和程序模塊的生成概率衡量其相似性.

      Saha 等人[40]提出了BLUiR 方法,將缺陷報告分成總結(jié)(summary)和描述這兩個部分,將程序模塊分成類名、函數(shù)名、變量名和注釋這4 個部分,基于已訓(xùn)練的BM25 模型,將其表示為特征向量,然后分別計算缺陷報告和程序模塊各部分文本相似度,并累加作為最終的文本相似度評分.

      (4) 模型比較

      Rao 等人[41]首次分析了文本檢索模型對缺陷定位性能的影響,比較了VSM、LSA、LDA、SUM 和CBDM等5 種通用文本模型以及它們的組合,實驗通過缺陷報告的描述文本信息定位缺陷程序模塊.實證結(jié)果表明:與更復(fù)雜的模型(例如LDA、LSA、CBDM 等)相比,簡單的模型(例如SUM、VSM)在基于檢索的缺陷定位上更加有效.

      Wang 等人[4]同樣分析了文本檢索模型對概念定位的影響,他們比較了VSM、SUM、NMF、LSI、pLSI 和LDA 等多個檢索模型,得到了與Rao 等人相似的實驗結(jié)論,即,簡單的IR 模型(例如VSM、SUM)比復(fù)雜的模型(例如LDA,LSI 等)定位效果更好.

      Thomas 等人[6]探索了不同分類器及其組合對缺陷定位性能的影響,他們比較了VSM、LSI 和LDA 等3 種模型,將缺陷報告表示分為僅考慮標(biāo)題、僅考慮描述和同時考慮標(biāo)題與描述這3 類,將程序模塊表示分為僅考慮標(biāo)識符、僅考慮注釋、同時考慮標(biāo)識符和注釋以及與程序模塊相關(guān)的歷史缺陷報告集合等6 類,預(yù)處理過程也將分割、詞干提取、停止詞移除這3 個過程通過排列組合方式形成8 種,然后分別對VSM 的詞權(quán)重與相似度計算規(guī)則、LSI 的詞權(quán)重、主題數(shù)與相似度計算規(guī)則、LDA 的迭代數(shù)、主題數(shù)等參數(shù)設(shè)置進(jìn)行多種設(shè)置,最后形成3 172 種基于IR 的分類器,用于缺陷定位.實驗結(jié)果表明:基于IR 的分類器其配置對缺陷定位性能有很大影響,其中最好的IRBL 分類器配置是使用缺陷報告和程序模塊的全部內(nèi)容,執(zhí)行3 步預(yù)處理過程,采用基于TF-IDF 的VSM 模型并計算余弦相似度.隨后,Thomas 等人還對分類器組合進(jìn)行探討,他們將分類器基于缺陷報告和程序模塊的表示方式分為4 個分類器子空間,保證每類分類器分類錯誤方式盡可能不同,同時采用兩個基本策略:在每個子空間中選取最好的分類器或隨機(jī)選擇分類器,將選擇的分類器采用線性擬合的方式進(jìn)行定位.實驗結(jié)果表明,分類器組合在幾乎所有情況下都能夠提高缺陷定位性能.

      Tantithamthavorn 等人[7]基于Thomas 等人[6]的工作,著重分析了分類器的配置對函數(shù)級別缺陷定位的性能和成本(effort)的影響,成本指找到缺陷程序模塊所需檢查代碼行數(shù)的代價.他們采用相同的配置,比較了3 172個分類器.他們做出以下觀察:(1) 分類器配置的選擇對性能和成本影響較大,TopKRank 性能的影響介于0.44%~36%之間,需要的成本介于4395LOC~50000LOC 之間;(2) 給出相似TopKRank 性能的分類器,需要的成本也不同;(3) VSM 模型在函數(shù)級別缺陷定位獲得最好的TopKRank 性能和最少的成本代價;(4) 與程序模塊表示相關(guān)的配置對TopKRank 性能和成本代價的影響最大;(5) 在函數(shù)級別缺陷定位上最有效的配置同樣可用于文件級別缺陷定位上.

      通過分析相關(guān)文獻(xiàn),我們發(fā)現(xiàn):在經(jīng)典檢索模型中,VSM、SUM 等簡單IR 模型往往能表現(xiàn)更好的性能,VSM模型是所有經(jīng)典模型中被使用次數(shù)最多的模型.IR 模型配置的選擇對缺陷定位性能影響較大,需要針對不同數(shù)據(jù)集做不同選擇.

      3.1.2 優(yōu)化方法

      1) 基于輸入源拓展的方法

      缺陷報告包含的自然語言與程序模塊包含的程序語言存在較大差異,因此將文本檢索模型應(yīng)用于缺陷定位有時效果并不理想.研究人員嘗試基于領(lǐng)域知識提取特征,以提高檢索結(jié)果.這類方法基于領(lǐng)域知識(如將文件分解成函數(shù)、使用庫組件的API 描述、分析缺陷修復(fù)歷史和代碼變更歷史等),設(shè)計出合適的特征來更為合理地計算出缺陷報告與程序模塊之間的相似度.

      Zhou 等人[18]發(fā)現(xiàn):(1) 代碼規(guī)模大的文件,其含有缺陷的可能性更高;(2) 如果兩個缺陷報告的文本相似度很高,則這兩個缺陷報告很可能對應(yīng)相同的缺陷模塊.他們據(jù)此提出了BugLocator 方法,在計算VSM 評分時將程序模塊的詞數(shù)加入考慮,用于修正VSM 評分;同時,從已修復(fù)的缺陷報告中搜索與當(dāng)前缺陷報告相似的缺陷報告,給對應(yīng)的缺陷程序模塊賦予一個評分.最終,基于VSM 評分和相似缺陷報告評分來定位缺陷.

      Rahman 等人[42]進(jìn)一步考慮了程序模塊代碼結(jié)構(gòu)和其缺陷修復(fù)次數(shù),將缺陷報告中疑似類名或方法名的文本識別出,并對這些類或包含這些方法的類賦予額外的優(yōu)先因子β;同時,根據(jù)程序模塊缺陷修復(fù)次數(shù)對缺陷報告和程序模塊的相關(guān)度評分進(jìn)行微調(diào).最后,對相關(guān)度評分和優(yōu)先因子β進(jìn)行線性擬合.

      Youm 等人[43]基于上述的文本信息、堆棧跟蹤信息、結(jié)構(gòu)信息和代碼變更信息求得對應(yīng)的評分StructVsmScore(r,c),SimiBugScore(r,c),StraceScore(r,c)以及從代碼變更歷史信息計算的評分CommScore(r,c,k),最后憑經(jīng)驗對4 項缺陷報告和程序模塊評分進(jìn)行加權(quán).

      Uneno 等人[44]提出了CombBL 模型,從4 個方面計算缺陷報告和程序模塊的相似度:基于word2vec 的相關(guān)度評分、基于BugLocator[18]方法計算的文本相似度評分、基于缺陷修復(fù)歷史的評分和基于組件域的評分.其中:基于word2vec 的相關(guān)度評分是將缺陷報告和程序模塊以其詞向量的均值作為表示向量,計算余弦相似度;基于組件域的評分是以預(yù)處理后的缺陷報告中的每個詞對程序模塊全路徑名進(jìn)行松散搜索,成功則對應(yīng)評分加1.最后對4 種評分進(jìn)行線性擬合,并根據(jù)經(jīng)驗設(shè)置參數(shù).

      Dilshener 等人[45,46]從文本信息和堆棧跟蹤信息的角度出發(fā),分析詞位置信息后發(fā)現(xiàn),在缺陷報告總結(jié)中的第1、第2、倒數(shù)第2 和倒數(shù)第1 個詞很可能與對應(yīng)的缺陷程序模塊相關(guān);分析堆棧跟蹤后發(fā)現(xiàn),缺陷程序模塊通常出現(xiàn)在堆棧跟蹤的前5 個文件中.他們對此采取的方法是,根據(jù)缺陷報告中的詞在程序模塊中出現(xiàn)的位置不同賦予不同的評分,例如,出現(xiàn)在文件名中的詞賦予更高的評分.

      Swe 等人[47]從文本結(jié)構(gòu)、堆棧跟蹤和相似缺陷報告這3 個角度計算缺陷報告和程序模塊的相似度.其中,文本結(jié)構(gòu)僅考慮程序模塊的結(jié)構(gòu)信息,通過抽象語法樹將程序模塊分為類名、方法名、變量名,分別與缺陷報告計算文本相似度.該方法最后通過對3 種評分進(jìn)行線性擬合來定位缺陷.

      Barbosa 等人[48]結(jié)合軟件特征對缺陷報告和程序模塊學(xué)習(xí)新的特征表示:在第1 階段,通過語言模型學(xué)習(xí)軟件工程領(lǐng)域文本數(shù)據(jù)的詞嵌入表示;第2 階段,通過一個由缺陷報告、程序模塊、代碼指標(biāo)等形成的異構(gòu)網(wǎng)絡(luò)學(xué)習(xí)一個基于網(wǎng)絡(luò)的特征表示.通過新的特征表示,可計算缺陷報告和程序模塊的相似度.

      Rath 等人[49,50]分析了缺陷報告中的結(jié)構(gòu)化信息對IRBL 的影響,他們將缺陷報告文本分為自然語言、源代碼和堆棧跟蹤這3 類,并形成7 種組合進(jìn)行實驗.結(jié)果表明:源代碼文本通常能提高缺陷定位性能,堆棧跟蹤則有好有壞.

      2) 基于優(yōu)化函數(shù)的方法

      IRBL 中,不同的特征有不同的意義,并且對多個軟件項目有不同的影響.憑經(jīng)驗設(shè)置參數(shù)不具有通用性,通過參數(shù)學(xué)習(xí)方法可自動學(xué)出合適的參數(shù).這類方法將缺陷定位問題轉(zhuǎn)換成基于參數(shù)學(xué)習(xí)的排序問題,即根據(jù)歷史缺陷報告修復(fù)信息對當(dāng)前程序模塊與給定缺陷報告的相關(guān)性進(jìn)行優(yōu)化排序.該方法需定義一個優(yōu)化函數(shù)或排序函數(shù).

      Ye 等人[51]提出一種基于學(xué)習(xí)排序(learning to rank)的方法,他們利用領(lǐng)域知識,結(jié)合代碼中使用的庫函數(shù)API 描述、缺陷修復(fù)歷史和代碼變更歷史,設(shè)計了6 類特征:表面詞匯相似度(surface lexical similarity)、API 增強(qiáng)詞匯相似度(API-enriched lexical similarity)、協(xié)同過濾評分(collaborative filtering score)、缺陷修復(fù)近因(bugfixing recency)、缺陷修復(fù)頻率(bug-fixing frequency).在標(biāo)準(zhǔn)化后,使用一個排序模型進(jìn)行訓(xùn)練,其評分函數(shù)f(r,c)定義如下.

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

      其中,w是權(quán)重參數(shù)矩陣,P(r)表示與缺陷報告r相關(guān)的程序模塊,N(r)表示與缺陷報告無關(guān)的程序模塊.

      Zhao 等人[52]探討了學(xué)習(xí)排序算法在缺陷定位上的成本代價問題,即找到缺陷程序模塊所需檢查代碼行數(shù)的代價,并定義了3 個衡量代價的指標(biāo):Effort@k,MAE 和MFE.他們復(fù)現(xiàn)了Ye 等人的缺陷定位方法[51],并與VSM、Usual Suspects 方法進(jìn)行了比較.實驗結(jié)果表明:學(xué)習(xí)排序算法在成本敏感指標(biāo)上要顯著優(yōu)于Usual Suspects,但在Effort@k上要差于VSM 算法.

      Shi 等人[53]比較了學(xué)習(xí)排序算法在混合缺陷定位中的性能,他們將不僅考慮了文本相似度特征、還利用其他特征(如版本歷史、程序模塊結(jié)構(gòu)、動態(tài)分析等特征)的缺陷定位方法定義為混合缺陷定位.在總結(jié)前人工作的基礎(chǔ)上,他們將輸入特征分為7 類:文本信息、堆棧跟蹤、版本歷史、依賴圖、文本結(jié)構(gòu)、相似缺陷報告、執(zhí)行信息,并對特征進(jìn)行不同的歸一化操作:linear 歸一化、sum 歸一化、Z-score 歸一化以及不進(jìn)行任何操作.Shi等人之后對8 種學(xué)習(xí)排序方法的性能進(jìn)行比較,這8 種方法分別為MART(multiple additive regression trees)、RankNet、RankBoost、AdaRank、Coordinate Ascent、LambdaMART、ListNET 和Random Forests.實驗結(jié)果表明,沒有進(jìn)行歸一化處理的coordinate ascent 算法是所以學(xué)習(xí)排序算法中性能最好的.

      Wang 等人[34]從版本歷史、相似缺陷報告、結(jié)構(gòu)信息、堆棧跟蹤和報告人信息的角度出發(fā),計算了5 種特征,其綜合評分為5 種特征的加權(quán)求和.該方法使用遺傳算法對權(quán)重進(jìn)行調(diào)參,優(yōu)化目標(biāo)為使歷史已修復(fù)缺陷報告的定位性能達(dá)到最高,即,使評價指標(biāo)MAP 和MRR 總和達(dá)到最高.優(yōu)化目標(biāo)具體如下.

      其中,MAP 和MRR 為IRBL 性能評估時常用的評測指標(biāo).

      Gharibi 等人[54]設(shè)計了5 類特征:token 匹配評分、VSM 相似度評分、堆棧跟蹤評分、語義相似度評分和基于已修復(fù)缺陷報告的評分.其中,

      · token 匹配評分是統(tǒng)計缺陷報告和程序模塊指定部分的token 匹配數(shù):第1 階段檢查總結(jié)中是否包含程序模塊名,第2 階段則檢查總結(jié)和描述中的詞性token 與類名、方法名、注釋中的token 是否匹配.

      · 基于已修復(fù)缺陷報告的評分則使用多標(biāo)簽分類算法One-Vs-The-Rest 對缺陷報告進(jìn)行分類.該方法基于目標(biāo)函數(shù)ObjFunc=MRR+MAP對權(quán)重參數(shù)進(jìn)行優(yōu)化.

      Almhana 等人[55]提出一種多目標(biāo)優(yōu)化方法,在最小化推薦的程序模塊數(shù)的同時,最大化提出方案的相關(guān)性.他們采用算法NSGA-II 進(jìn)行搜索,候選集為一個向量表示,每一維表示推薦給缺陷報告的類,推薦類的順序?qū)?yīng)它們在向量中的位置.其適應(yīng)值函數(shù)為

      其中,LS表示詞法相似度,由缺陷報告描述與程序模塊的相似度以及缺陷報告描述與推薦的程序模塊中函數(shù)API 說明的相似度組成;HS表示基于歷史的相似度,由程序模塊的歷史修復(fù)次數(shù)度量、最近的修改時間度量和歷史缺陷報告的推薦一致性指標(biāo)決定.

      (3) 基于查詢重構(gòu)的方法

      這類方法基于缺陷報告、程序模塊、堆棧跟蹤信息或者補(bǔ)丁等中的關(guān)鍵詞來嘗試構(gòu)建新的查詢,并進(jìn)行檢索.查詢重構(gòu)方法基于不同的策略可進(jìn)一步細(xì)分為查詢擴(kuò)充(query expansion)、查詢替換(query replacement)、詞選擇(term selection)、查詢縮減(query reduction)[56].

      Sisman 等人[57]基于程序模塊中描述相同概念或功能的詞距離比較接近的觀察,提出一個新的查詢重構(gòu)框架,根據(jù)程序模塊中的詞與缺陷報告中的詞距離,構(gòu)建一個新的查詢.該方法用初始查詢(即缺陷報告)檢索程序模塊語料庫,并從檢索結(jié)果中挑選出與初始查詢中詞距離最接近的詞,將其加入到初始查詢中,最后重新進(jìn)行檢索.實驗結(jié)果表明:該方法能夠有效地提高缺陷定位性能,并且效果超過兩個經(jīng)典的 QR 方法 Rocchio’s Formula[58]和Relevance Model[59].Sisman 等人[60]在之后的工作中進(jìn)一步識別缺陷報告中的堆棧跟蹤信息或補(bǔ)丁,從這些結(jié)構(gòu)組件中提取詞來構(gòu)建最終的查詢.Chaparro 等人[61]發(fā)現(xiàn):在大多數(shù)情況下,缺陷報告變成低質(zhì)量查詢的原因是非相關(guān)詞的存在(即噪音),因此猜想,將低質(zhì)量查詢刪減成只描述觀測行為(observed behavior,簡稱OB)的詞可以提高IRBL 的性能.其中,觀測行為指當(dāng)前軟件的錯誤行為.觀測行為的識別主要通過人工識別,采用詞選擇策略選擇OB 詞進(jìn)行刪減.實驗結(jié)果表明:當(dāng)缺陷報告形成低質(zhì)量查詢時,將缺陷報告詞刪減為觀測行為OB 相關(guān)的詞,能有效提高IRBL 的性能.Rahman 等人[62]提出了基于上下文感知的查詢重構(gòu)方法,他們根據(jù)缺陷報告是否包含堆棧跟蹤信息和是否包含程序元素,將缺陷報告分為3 類:包含堆棧跟蹤的缺陷報告(即有噪聲的缺陷報告)BRST、包含程序元素的缺陷報告(即富余的缺陷報告)BRPE、只有自然語言的缺陷報告(即貧乏的缺陷報告)BRNL.針對包含不同信息的缺陷報告,Rahman 等人進(jìn)行不同的處理:對于BRST,將堆棧跟蹤轉(zhuǎn)換為跟蹤圖(trace graph),節(jié)點為類名或方法名,邊表示節(jié)點間的依賴關(guān)系;對于 BRPE,基于詞共現(xiàn)(word cooccurrence)和詞性依賴(pos dependency)構(gòu)建兩個文本圖(text graph);對于BRNL,搜集返回的前k個程序模塊,抽取其中的方法名或變量名等,并構(gòu)建源詞圖(source term graph).隨后采用PageRank 方法進(jìn)行詞權(quán)重賦值并挖掘關(guān)鍵詞,基于權(quán)重較大的前k個關(guān)鍵詞構(gòu)建新的查詢.

      缺陷報告的質(zhì)量(即文本內(nèi)容)有高有低,有些缺陷報告中包含堆棧跟蹤或文件名等信息,對查詢重構(gòu)和缺陷定位有顯著影響.Mills 等人[63]探討了該類缺陷定位中存在的潛在偏見,比較了帶提示(包含代碼片段和方法名等)的缺陷報告和不帶提示的缺陷報告在通過遺傳算法進(jìn)行近優(yōu)查詢時的定位結(jié)果.實驗結(jié)果表明:在使用缺陷報告的全部文本作查詢時,尤其在沒有定位提示(即類名或方法名等)時,基于文本檢索的缺陷定位性能很差.但存在一個最優(yōu)查詢,使其缺陷定位性能相比于默認(rèn)查詢有較大的性能提升.該結(jié)論在沒有定位提示的缺陷報告中依然成立.他們認(rèn)為,最優(yōu)查詢的規(guī)劃在IRBL 中值得進(jìn)一步研究.

      3.1.3 基于文本相似度的方法間的對比

      如表3 所示,該表統(tǒng)計基于文本相似度的方法所使用的軟件特征(僅列出CCF 列表中B 類以上的論文),·表示文獻(xiàn)使用了該列所對應(yīng)的軟件特征.在基于輸入源拓展的方法中,研究人員使用的軟件特征逐漸增多.通過經(jīng)典模型與軟件特征相結(jié)合,IRBL 的缺陷定位性能得到了有效提高.基于優(yōu)化函數(shù)的方法在利用多個軟件特征的基礎(chǔ)上,定義一個優(yōu)化目標(biāo).相較于基于輸入源拓展的方法,基于優(yōu)化函數(shù)的方法可有效學(xué)習(xí)模型參數(shù).基于查詢重構(gòu)的方法在不利用額外輸入源的基礎(chǔ)上,提高了IRBL 的缺陷定位性能.從總體缺陷定位效果上比較,目前,基于優(yōu)化函數(shù)的方法取得相對較好的性能.

      Table 3 Usage statistics of the features used by text similarity methods表3 基于文本相似度的方法的特征使用情況統(tǒng)計

      3.2 基于語義相似度的方法

      自然語言和程序語言存在較大的差異,因此造成缺陷報告與程序模塊間也存在較大的差異性.為解決詞匯不匹配問題,有研究人員從語義角度出發(fā),通過提取文本語義特征來計算語義相似度.這類方法主要構(gòu)建多層神經(jīng)網(wǎng)絡(luò),通過深度學(xué)習(xí)提取特征并計算.常用的可選模型有CNN(convolutional neural network),DNN(deep neural network)或LSTM(long short-term memory)等.

      Huo 等人[70]借助CNN 來捕獲程序模塊中代碼的結(jié)構(gòu)信息和語義信息,該方法的輸入為缺陷報告和程序模塊,主要結(jié)構(gòu)包括語言內(nèi)特征提取層和跨語言特征融合層:在語言內(nèi)特征提取層,分別對缺陷報告和程序模塊提取詞法信息和程序結(jié)構(gòu)信息;在跨語言特征融合層,將兩個向量拼接為一個統(tǒng)一的特征向量.之后,通過一個全連接層分類,其目標(biāo)函數(shù)如下.

      Lam 等人[72,73]使用DNN 解決缺陷報告和程序模塊的詞不匹配問題,并與基于軟件特征的方法相結(jié)合,提出了HyLoc 方法.HyLoc 方法使用rVSM 收集缺陷報告和程序模塊的文本相似度特征;根據(jù)項目元數(shù)據(jù)獲取缺陷修復(fù)頻率、類名相似度等特征;通過DNN 網(wǎng)絡(luò)學(xué)習(xí)缺陷報告和程序模塊的標(biāo)識符、類名、函數(shù)名、注釋以及API 描述的關(guān)聯(lián);最后,通過一個DNN 特征融合層學(xué)習(xí)各類特征的權(quán)重參數(shù).

      Xiao 等人[74]充分利用缺陷報告和程序模塊中的語義信息,并將CNN 和缺陷修復(fù)歷史信息相結(jié)合,提出了基于增強(qiáng)CNN 的DeepLocator.該方法將預(yù)處理后的缺陷報告和程序模塊用詞嵌入向量表示,以缺陷報告和程序模塊中最大句子長度為單位,填充每個句子到同一維度,作為增強(qiáng)CNN 的輸入.增強(qiáng)CNN 包含1 個卷積層、1個最大池化層和1 個dropout 層,在代價函數(shù)中引入缺陷修復(fù)近因和缺陷修復(fù)頻率,具體如下.

      其中,N是batch 大小,T為程序模塊的數(shù)目.costi為缺陷報告i的代價函數(shù),tij為缺陷報告i關(guān)于程序模塊j的真實值,yij是缺陷報告i關(guān)于程序模塊j的輸出概率值,ω1和ω2是缺陷修復(fù)近因和缺陷修復(fù)頻率權(quán)重調(diào)節(jié)參數(shù).Xiao等人[75]隨后改進(jìn)了文獻(xiàn)[74]的模型,從語句角度出發(fā),將語句表示為一個向量,對缺陷報告和程序模塊采用兩種不同的詞嵌入技術(shù):Sent2Vec 和加權(quán)平均嵌入(weighted average word2vec).缺陷報告的描述通過Sent2Vec 可將其中的每個句子轉(zhuǎn)化為一個向量,這個策略在降低內(nèi)存占用和計算代價的同時,獲得與word2vec 相似或更好的性能,程序模塊通過加權(quán)平均嵌入可獲得每個代碼語句的嵌入表示.隨后,通過CNN 對缺陷報告和程序模塊的向量表示進(jìn)行特征檢測和提取,統(tǒng)一兩個向量的維度以便平行拼接,其最終代價函數(shù)與文獻(xiàn)[74]中相同.

      Xiao 等人[76]使用詞嵌入將缺陷報告和程序模塊轉(zhuǎn)換為向量,保存語義信息,然后考慮到缺陷報告和程序模塊的不同特性,對缺陷報告使用多filter 的CNN 網(wǎng)絡(luò)提取特征和降維,對程序模塊使用多粒度掃描的隨機(jī)森林,最后通過兩個CRF(completely-random tree forests)和兩個隨機(jī)森林形成的級聯(lián)森林來提取缺陷報告和程序模塊的深層特征并分類.

      缺陷報告和程序模塊具有不同的表達(dá)方式.Xiao 等人[77]首次將機(jī)器翻譯技術(shù)用于解決缺陷報告和程序模塊的詞不匹配問題.該方法的訓(xùn)練實例為缺陷報告和對應(yīng)缺陷程序模塊解析的抽象語法樹節(jié)點形成的文本對以及從API 文檔中提取的類、函數(shù)、字段的注釋與其聲明、函數(shù)調(diào)用、類實例形成的文本對.該方法通過一個基于注意力機(jī)制的RNN 編碼器和RNN 解碼器訓(xùn)練模型.當(dāng)給定一個新的缺陷報告,該方法基于缺陷報告和程序模塊的概率評分來定位缺陷程序模塊.

      現(xiàn)有的基于深度學(xué)習(xí)的缺陷定位技術(shù)大多集中于新型網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計,而對網(wǎng)絡(luò)損失函數(shù)的設(shè)計缺乏應(yīng)有的關(guān)注.已有的工作大多在輸出層使用sigmoid 函數(shù)作為激活函數(shù),采用交叉熵?fù)p失進(jìn)行訓(xùn)練.這種損失函數(shù)對距離分類邊界較遠(yuǎn)的異常點比較敏感,限制了缺陷定位性能的提升.針對這個問題,解錚等人[78]提出一種代價敏感的間隔分布優(yōu)化損失函數(shù),將間隔分布優(yōu)化問題通過代價敏感的方式擴(kuò)展至非對稱情況.該方法通過一層卷積層和一層池化層對缺陷報告提取特征,通過2 個卷積層和2 個池化層對程序模塊提取特征,然后拼接兩個特征表示,并通過全連接層學(xué)習(xí)一個統(tǒng)一的特征映射,最后通過訓(xùn)練好的模型定位缺陷程序模塊.

      3.3 兩類方法對比

      從定位模式分析,基于文本相似度的方法主要考慮缺陷報告和程序模塊的共有詞匹配,尤其缺陷報告中的程序?qū)嶓w名與程序模塊中的程序?qū)嶓w名的匹配.Wang 等人[79]早期以基于文本相似度的方法為基準(zhǔn)方法評價IRBL 技術(shù)的有效性,他們發(fā)現(xiàn):缺陷報告中的程序?qū)嶓w名通常對IRBL 的性能起正面作用,缺陷報告中的堆棧跟蹤信息和測試用例信息則并不總是有效的,因其會引入許多無關(guān)的程序模塊.而如果僅利用基于自然語言描述的缺陷報告,IRBL 方法的缺陷定位性能通常并不理想.基于文本相似度的方法對由自然語言和程序語言差異造成的詞不匹配問題并不能很好地予以解決,從查詢優(yōu)化的角度來試識別并過濾掉缺陷報告中的冗余和無效文本以及從軟件項目中挖掘與缺陷程序模塊相關(guān)的特征信息等措施,是從其他角度補(bǔ)充缺陷定位所需的信息,提升定位準(zhǔn)確率.基于語義相似度的方法主要挖掘缺陷報告和程序模塊的內(nèi)在語義,從詞義[76]、語義[76]、程序結(jié)構(gòu)[70]和語句順序[71]等多個角度考慮,并通過學(xué)習(xí)API 文檔、項目文檔等獲取額外知識[77,80],以緩解缺陷報告和程序模塊的詞不匹配問題.Polisetty 等人[81]在分析基于深度學(xué)習(xí)的缺陷定位方法在軟件開發(fā)中的可用性時,與部分基于文本相似度的方法進(jìn)行了比較,并從縮小詞匯差異、方法有效性和方法普適性等角度進(jìn)行分析研究.結(jié)果表明:基于深度學(xué)習(xí)的方法,其缺陷定位性能要優(yōu)于基于傳統(tǒng)檢索模型的方法,并可有效緩解詞不匹配問題,但也需要更多的訓(xùn)練時間和硬件資源.

      從定位粒度的角度分析,基于文本相似度的方法根據(jù)選擇方法的不同,可定位到文件、函數(shù)、語句和代碼變更等級別;而基于語義相似度的方法因模型訓(xùn)練因素,一般都定位到文件級別.受限于應(yīng)用場景和開發(fā)人員的實際需求,這兩類方法各有優(yōu)缺點.

      4 場景應(yīng)用

      根據(jù)不同的場景需求,開發(fā)人員對缺陷定位粒度和準(zhǔn)確率的需求不同.基于IRBL 的定位粒度,IRBL 方法輸出級別可分為文件(類)級別、函數(shù)級別、語句級別和代碼變更級別,下面將依次介紹.其中,文件和類級別因多數(shù)文件是單個文件包含單個類,文件和類的文本量級比較接近,對IRBL 方法而言幾乎沒有區(qū)別,因此不作區(qū)分.

      4.1 文件級別

      目前,大多數(shù)IRBL 方法都定位到文件級別.給定一個缺陷報告,將一個按照缺陷懷疑率從大到小排序的有序文件列表推薦給開發(fā)人員.文件級別缺陷定位因其代碼文本包含足夠多的信息,可將IR 方法直接應(yīng)用于文件級別的缺陷定位.

      Klnc 等人[82]通過多級重排序算法來實現(xiàn)文件級別的缺陷定位:在第1 級,為解決詞的語義信息被忽視的問題,從程序模塊中提取出去除注釋的代碼、類名、方法名和注釋4 類文檔,分別計算與缺陷報告的相似度并調(diào)整權(quán)重;在第2 級,在第1 級的基礎(chǔ)上保存每個缺陷報告對應(yīng)的前k個程序模塊形成新的文檔集,丟棄不相關(guān)的程序模塊,重新構(gòu)建新的索引并查詢,將兩級的結(jié)果綜合考慮.

      陳理國等人[83]提出了基于高斯過程的缺陷定位方法.基于高斯過程的缺陷定位,其直觀含義可以表述為:每個缺陷報告節(jié)點和程序模塊節(jié)點對對應(yīng)一個隱含函數(shù)值,隱含函數(shù)值完全決定了節(jié)點對之間是否有鏈接關(guān)系,且隱含函數(shù)值服從高斯分布,協(xié)方差函數(shù)與缺陷報告節(jié)點和源文件節(jié)點對應(yīng)的向量相關(guān).陳理國等人首先采用優(yōu)先采集算法,使得樣本集中的正負(fù)樣本是均等的;然后學(xué)習(xí)缺陷報告和程序模塊節(jié)點對隱含函數(shù)值的高斯分布,當(dāng)隱含值大于指定閾值時,則預(yù)測值為1,程序模塊與缺陷報告相關(guān).

      Distante 等人[84]提出一個兩階段缺陷定位方法:第1 階段,針對每個程序模塊訓(xùn)練一個多層感知機(jī),對新來的缺陷報告預(yù)測該程序模塊是否與缺陷報告相關(guān),相關(guān)的程序模塊集合即為缺陷程序模塊集合;第2 階段,對與缺陷程序模塊相關(guān)的多個缺陷報告表示求其平均表示,計算新的缺陷報告與相關(guān)缺陷報告平均表示的相似度,根據(jù)相似度結(jié)果排序選前K個候選缺陷程序模塊,優(yōu)化排序結(jié)果.

      除以上常見方法外,在基于文件級別的缺陷定位中存在一類特殊的方法,在推薦有序缺陷列表前會執(zhí)行一個可靠性判斷.因在IRBL 中,總存在一些缺陷報告缺乏足夠的定位信息,造成IRBL 方法定位效果不理想.如果將不理想的缺陷定位結(jié)果推薦給開發(fā)人員,反而會增加缺陷定位成本,并降低缺陷定位方法的可信度.針對這個問題,Kim 等人[85]提出一種兩階段推薦模型,判斷缺陷報告是否含有足夠的信息,只有在缺陷報告包含足夠的信息時,才進(jìn)一步基于缺陷報告的內(nèi)容預(yù)測缺陷模塊.他們從缺陷報告的總結(jié)、描述、元數(shù)據(jù)以及報告者的評論中抽取特征,缺陷報告可預(yù)測的標(biāo)準(zhǔn)是基于缺陷報告特征使用樸素貝葉斯模型推薦的前k個程序模塊中,命中至少一個缺陷程序模塊,則該缺陷報告被認(rèn)為是可預(yù)測的.基于歷史缺陷報告訓(xùn)練一個二分類模型后,可判斷新的缺陷報告是否可預(yù)測,然后對可預(yù)測的缺陷報告使用多分類模型推薦缺陷程序模塊.Le 等人[86,87]則通過構(gòu)建一個喻言(oracle)數(shù)據(jù)庫,自動預(yù)測IRBL 方法生成的排序列表是否有用.他們認(rèn)為:一個排序列表是有用的,僅當(dāng)缺陷程序模塊出現(xiàn)在該排序列表的前N位.其考慮的特征分為4 類:懷疑率的評分特征(含有64 個特征)、報告的文本特征(含有2 個特征)、主題模型特征(含有8 個特征)和元數(shù)據(jù)特征(含有14 個特征),在這4 大類特征上分別預(yù)測有效性,并加權(quán)計算得到最終評分.當(dāng)評分大于某個閾值時,則排序列表有效;反之則無效.

      4.2 函數(shù)級別

      類和文件級別對開發(fā)人員而言存在粒度過粗的問題,需要開發(fā)人員檢查大量的代碼.通常,缺陷的修復(fù)是位于某個函數(shù)代碼內(nèi).給定一個缺陷報告,基于函數(shù)級別的缺陷定位方法可以將一個按照缺陷懷疑率從大到小排序的有序函數(shù)列表推薦給開發(fā)人員.然而函數(shù)級別的缺陷定位相比于文件級別的缺陷定位,因為粒度縮小,每個函數(shù)包含的代碼文本和詞匯數(shù)要少許多,這會導(dǎo)致傳統(tǒng)的信息檢索模型因為稀疏表示問題運(yùn)行困難.

      有研究人員從文本擴(kuò)充的角度出發(fā),增加函數(shù)相關(guān)詞的數(shù)量.Nichols[88]提出一個函數(shù)級別的IRBL 方法,依據(jù)缺陷報告的修復(fù)記錄,將缺陷報告中的詞加入到對應(yīng)缺陷程序模塊受影響的函數(shù)代碼中,這樣函數(shù)就額外包含與修復(fù)缺陷相關(guān)的缺陷文本信息.當(dāng)一個新的缺陷報告到來時,用LSI 模型檢索增強(qiáng)后的函數(shù)文本.

      張文等人[89]考慮另一種函數(shù)增強(qiáng)方法,對于每個函數(shù),計算該函數(shù)與其他所有函數(shù)的相似度并求其平均值,將大于平均值的函數(shù)向量表示擴(kuò)充進(jìn)該函數(shù)中,其計算公式如下.

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

      其中,mk表示函數(shù)k的向量表示,acik是從3 個角度衡量函數(shù)i和函數(shù)k的相似度的加權(quán)和.針對新來的缺陷報告,可基于增強(qiáng)后的函數(shù)進(jìn)行檢索.

      Youm 等人[67]將缺陷定位粒度從文件級別拓展至函數(shù)級別,在獲得文件級別的可疑文件排序列表的基礎(chǔ)上,對前10 的文件中的函數(shù)計算其與缺陷報告的文本相似度,然后根據(jù)代碼變更歷史信息,找出報告提交的k天內(nèi)被修改的函數(shù)并計算函數(shù)修改評分,兩者加權(quán)計算可得函數(shù)的懷疑評分.

      Rahman等人[91,92]提出了函數(shù)級別的缺陷定位方法MBuM,通過最小化搜索空間來提高定位準(zhǔn)確度.他們將動態(tài)分析和靜態(tài)分析相結(jié)合,首先根據(jù)程序模塊執(zhí)行路徑獲取函數(shù)調(diào)用順序,排除不相關(guān)的函數(shù);然后根據(jù)函數(shù)名對函數(shù)內(nèi)容進(jìn)行靜態(tài)分析,基于缺陷報告檢索函數(shù)內(nèi)容.為了避免語義信息的損失,MBuM 還進(jìn)行同義詞匹配,如“terminate”,“stop”與“close”詞同義.實驗結(jié)果表明,MBuM 在大部分用例中將缺陷函數(shù)排在第一位.

      Davies 等人[66]綜合多源信息設(shè)計與函數(shù)強(qiáng)相關(guān)的特征,從文本信息的角度計算缺陷報告描述與函數(shù)的相似度;從缺陷報告的角度,用歷史缺陷報告作為文檔集,對每個函數(shù)訓(xùn)練一個二分類器,判斷缺陷報告是否與函數(shù)相關(guān),然后對新來的缺陷報告為每個函數(shù)做分類;同時統(tǒng)計每個函數(shù)曾包含的缺陷數(shù)以及在堆棧跟蹤的排名的倒數(shù);最后,基于這4 類特征使用線性回歸方法來定位缺陷.

      針對函數(shù)級別缺陷定位,也有研究人員不作區(qū)分,將函數(shù)級別和文件級別陷定位統(tǒng)一對待.Chaparro[93]將缺陷報告的描述分為5 個部分:標(biāo)題、觀測行為OB、期望行為(expected behavior)、復(fù)現(xiàn)步驟和代碼片段.這些文本識別都是通過人工識別,然后對這5 個部分排列組合可形成31 個不同的重構(gòu)策略,其檢索文檔為文件、類或函數(shù).實驗結(jié)果表明:標(biāo)題和觀察行為相結(jié)合是最好的重構(gòu)策略,并在大部分樣例中都適用.基于缺陷報告描述的查詢重構(gòu)能有效去除報告中的噪音,提高缺陷定位性能.Hill 等人[94]考慮使用詞的位置距離(positional proximity)來度量程序模塊和缺陷報告的相似度,以整合詞鄰近和詞序信息,捕捉其語義信息.他們直接比較了8種方法:順序依賴馬爾科夫隨機(jī)場(MRF-SD)、DLM(Dirichlet language model)、基于語句距離的方法(STMT)、基于函數(shù)距離的方法(MTHD)、TF-IDF 方法、NL-Sig、NL-Body、SWUM(software word usage model).其中,NL-Sig只使用從函數(shù)簽名(method signatures)中提取的短語概念,NL-Body 使用從函數(shù)的方法調(diào)用中提取的短語概念,SWUM 則結(jié)合NL-Sig 和應(yīng)用于函數(shù)的TF-IDF.實驗結(jié)果表明:位置距離對函數(shù)級別的定位提升不如文件級別定位明顯,其中,MRF 和其變種DLM 在多個數(shù)據(jù)集上都更加有效.

      4.3 語句級別

      基于語句級別的缺陷定位因為文本內(nèi)容過少,需設(shè)計與語句強(qiáng)相關(guān)的特征.Rahman 等人[95]提出了語句級別的缺陷定位方法MSDG,采用動態(tài)分析和靜態(tài)分析相結(jié)合的方式.首先跟蹤程序模塊執(zhí)行過程,丟棄不相關(guān)的程序模塊,將相關(guān)的函數(shù)文本保留并處理;之后進(jìn)行靜態(tài)分析,MSDG 最大化每個語句的有效信息,將該語句和影響該語句每個元素的前語句信息加入一起考慮,生成節(jié)點和前節(jié)點依賴圖,每個語句節(jié)點包含該語句及其前語句的關(guān)鍵詞,最后計算缺陷報告與語句節(jié)點的文本相似度.同樣,為了增加語句的信息,MSDG 定位時考慮語句對應(yīng)函數(shù)的相似度評分和語句相似度評分,計算公式如下.

      其中,MS和NS分別表示包含語句S的函數(shù)的評分和語句S本身的相似度評分.

      4.4 代碼變更級別

      從實際角度出發(fā),向開發(fā)人員推薦與缺陷報告直接相關(guān)的程序模塊列表并不能提供修復(fù)缺陷的上下文信息.列表中的程序模塊排序獨立,開發(fā)人員只可能知道缺陷在哪,不知道什么引起的缺陷.基于代碼變更級別的缺陷定位方法定位到一次代碼變更(即在一次提交中被修改的多行代碼,也被稱為變更塊(change hunk)),可輔助開發(fā)人員理解缺陷,簡化缺陷修復(fù)任務(wù).

      Wen 等人[68]認(rèn)為,基于代碼變更的缺陷定位有一些優(yōu)勢:首先,描述變更的日志包含代碼變更目的、功能等重要信息;其次,變更塊通常是小段小段的代碼,是分割源代碼文件的一個可選方案,避免了大文件的噪音問題;最后,利用變更歷史可以增強(qiáng)缺陷定位性能.他們?yōu)榇颂岢隽薒ocus 方法,使用缺陷報告、該缺陷報告創(chuàng)建前的所有變更塊作為輸入,每個變更塊包含改變代碼行、上下文行的內(nèi)容和相應(yīng)的提交日志,可創(chuàng)建自然語言語料庫和代碼實體語料庫.Locus 針對這兩個語料庫分別進(jìn)行自然語言查詢和程序?qū)嶓w查詢,即分別計算缺陷報告與自然語言語料庫和代碼實體語料庫的相似度;之后,Locus 根據(jù)代碼變更歷史對代碼變更或文件計算一個增強(qiáng)評分(即越近的代碼修改越有可能引入缺陷),其可定位代碼變更級別或文件級別.實驗結(jié)果表明:相較于基于文件級別的缺陷定位,基于代碼變更的方法始終是最優(yōu)的.

      Loyola 等人[96]從語法和代碼變更依賴的角度對代碼變更學(xué)習(xí)特征表示,提出一個基于代碼變更的缺陷定位方法.該方法對缺陷報告中的詞進(jìn)行詞嵌入表示和字符級別的嵌入表示,并通過雙向LSTM 生成一個上下文豐富的特征表示;對代碼變更的語法表示通過雙線性LSTM 接收一系列詞,并將最終輸出的狀態(tài)作為語法特征表示,對代碼變更依賴則定義了一個代碼變更譜圖(code change genealogy),通過隨機(jī)游走(random walk)獲得節(jié)點的嵌入表示,作為變更依賴表示.該方法之后合并特征,并通過一個學(xué)習(xí)排序算法RankNet 計算相關(guān)評分.

      4.5 定位粒度分析

      該節(jié)對不同定位粒度的IRBL 方法進(jìn)行總結(jié).各定位級別所占論文比例如圖4 所示.文件級別的缺陷定位論文占據(jù)IRBL 論文3/4 的比例,是所有定位粒度中最多的.該定位粒度數(shù)據(jù)集獲取容易、程序模塊代碼大小適當(dāng),被研究人員廣泛研究,定位準(zhǔn)確率較高.目前,文件級別缺陷定位的公開數(shù)據(jù)集和共享實驗代碼也是最多的.函數(shù)級別的缺陷定位數(shù)據(jù)集獲取困難,程序模塊代碼行偏少,一般需要進(jìn)行額外處理,缺陷定位準(zhǔn)確率相較于文件級別缺陷定位偏低[67].語句級別的缺陷定位則必須獲取程序的執(zhí)行信息,動態(tài)分析和靜態(tài)分析相結(jié)合.有研究表明[97]:開發(fā)人員更傾向于選擇函數(shù)、語句和塊級別的缺陷定位方法,文件級別的缺陷定位帶來的高準(zhǔn)確率并不能滿足所有開發(fā)人員的需求,而且IRBL 方法的可靠性也讓眾多開發(fā)人員難以接受.目前,IRBL 方法無論從缺陷定位準(zhǔn)確率或是缺陷定位粒度,都有待提高.

      Fig.4 Statistics of the number of papers with different granularity levels for IRBL圖4 IRBL 不同定位粒度方法的論文數(shù)統(tǒng)計

      5 性能評測指標(biāo)分析

      為了方便后續(xù)研究工作更好地評估所提的IRBL 方法,本文總結(jié)研究人員在IRBL 中所使用的評測指標(biāo).IRBL 可視為一個經(jīng)典的信息檢索問題,因此可用信息檢索領(lǐng)域的常用評測指標(biāo)進(jìn)行評估(注意:與缺陷報告相關(guān)的程序模塊可能不止1 個).我們假定有Q個缺陷報告需要被查詢,將已有研究工作中常用的模型性能評測指標(biāo)總結(jié)如下.

      (1) MAP(mean average precision):該指標(biāo)返回的是所有缺陷報告的平均查準(zhǔn)率的均值.平均查準(zhǔn)率是對一個檢索結(jié)果在不同召回率點上的查準(zhǔn)率進(jìn)行平均,其計算公式為

      其中,

      ?pos(j)表示排名為j的實例是否與缺陷報告相關(guān):相關(guān)為1,否則為0.

      ?P(j)表示檢索在j位置時的查準(zhǔn)率.

      ?AvgPi表示查詢i的平均檢索查準(zhǔn)率.

      ?MAP表示Q個查詢的平均查準(zhǔn)率的均值.

      (2) TopKRank:該指標(biāo)在有些文獻(xiàn)中又被稱為Accuracy@k[75]、Hit@k[62]、Prediction Accuracy[25]、Recall at TopN[33]等,其返回正確定位的缺陷報告占所有缺陷報告的比例.正確定位的缺陷報告指在推薦的前k(k=1,5,10)個程序模塊中至少包含一個缺陷程序模塊,在有些文獻(xiàn)中,這個指標(biāo)返回的是正確定位的缺陷報告的個數(shù),這里,我們把該指標(biāo)統(tǒng)一為比例.

      (3) MRR(mean reciprocal rank):該指標(biāo)返回的是一系列查詢的倒數(shù)排名的平均.一個查詢的倒數(shù)排名指第1 個相關(guān)文檔的排名的倒數(shù),即缺陷程序模塊排名的倒數(shù),其計算公式為

      其中,ranki表示第1 個相關(guān)文件的排名.

      (4)P@t:該指標(biāo)返回的是在給定排序t為止檢索的平均查準(zhǔn)率.在指定t值時,有些文獻(xiàn)直接以查準(zhǔn)率(precision)表示P@t.其計算公式為

      其中,P(t)計算推薦t個程序模塊時的查準(zhǔn)率.

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

      其中,R(t)計算推薦t個程序模塊時的查全率.

      (6) First Relevant Rank:該指標(biāo)返回的是排序列表中第1 個缺陷程序模塊的排名.

      (7)f-measure:該指標(biāo)返回的是查準(zhǔn)率和查全率的調(diào)和平均數(shù),可以對查準(zhǔn)率和查全率這兩個指標(biāo)進(jìn)行有效的平衡,其計算公式為

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

      其中,m表示缺陷程序模塊的個數(shù),pm表示第m個缺陷程序模塊的排名,N表示所有程序模塊的個數(shù).

      (9) Rank of Retrieved Files:該指標(biāo)返回的是第1 個相關(guān)文件在指定范圍的缺陷報告?zhèn)€數(shù).通常有rank=1,2≤rank≤5,6≤rank≤10 和rank>10 的范圍.

      (10) Avg.Rank:該指標(biāo)返回的是所有缺陷模塊的平均排名.其計算公式為

      其中,FB表示缺陷報告的真實修復(fù)程序模塊,FR表示推薦的缺陷程序模塊,rankf表示程序模塊f的排名.

      (11) AFH@n(average first hit at top-n):該指標(biāo)返回的是排序列表中第1 個缺陷程序模塊的平均排名,衡量開發(fā)人員的工作量,其計算公式為

      其中,ranki表示排序列表中第1 個缺陷模塊的排名.

      上述指標(biāo)都是從程序模塊的角度考慮,Zhao 等人[52]首次從代價敏感(cost-effective)的角度分析,基于代碼審查工作新定義3 個缺陷定位性能指標(biāo):Effort@k、MAE(mean average effort)、MFE(mean first effort),具體如下.

      (1) Effort@t:該指標(biāo)返回的是成功定位相關(guān)缺陷程序模塊所花費(fèi)的平均代碼審查成本.其計算公式為

      其中,fij表示缺陷報告i的排序列表中第j個程序模塊,LOC 函數(shù)表示程序模塊的代碼行數(shù),Rs表示成功定位的缺陷報告數(shù).

      (2) MAE:該指標(biāo)返回的是定位缺陷報告的所有缺陷程序模塊所花費(fèi)的平均成本的均值,是指標(biāo)MAP 的成本代價變種.其計算公式為

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

      其中,ranki為缺陷報告i第1 個缺陷程序模塊的排名.

      本文對已有IRBL 研究中常用的性能評測指標(biāo)的累計使用次數(shù)進(jìn)行了統(tǒng)計,并從大到小進(jìn)行排序;同時給出了每個指標(biāo)的首次使用時間(包括對應(yīng)的參考文獻(xiàn)),最終結(jié)果見表4.從表中不難看出:經(jīng)常使用的評測指標(biāo)是MAP、TopKRank 和MRR,這些指標(biāo)使用率遠(yuǎn)超其他指標(biāo).除此之外,一些研究人員從成本收益角度來評估模型的缺陷定位性能,主要考慮的指標(biāo)包括Effort@k、MAE 和MFE.

      Table 4 Statistics of performance evaluation measures表4 性能評測指標(biāo)統(tǒng)計

      6 評測數(shù)據(jù)集總結(jié)

      在IRBL 中,因開源軟件項目數(shù)據(jù)獲取相對容易,研究人員一般使用開源軟件項目進(jìn)行科學(xué)研究.這一節(jié),本文對IRBL 中常被使用的評測數(shù)據(jù)集其累計使用次數(shù)和首次使用時間進(jìn)行總結(jié),方便后續(xù)研究人員進(jìn)行實驗對比.其最終結(jié)果見表5(表5 僅列出累計使用次數(shù)超過3 次的評測數(shù)據(jù)集).

      Table 5 Usage statistics of evaluation datasets表5 評測數(shù)據(jù)集的使用情況統(tǒng)計

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

      Fig.5 Collection process of bug localization datasets圖5 缺陷定位數(shù)據(jù)集的收集過程

      早期由于缺陷定位數(shù)據(jù)集并未共享,研究人員主要對開源軟件項目的少量缺陷報告進(jìn)行用例分析[51],造成相關(guān)研究工作難以重現(xiàn),相關(guān)論文數(shù)較少.從2012 年開始,隨著Eclipse、SWT、AspectJ 和Zxing 缺陷定位數(shù)據(jù)集的公開,對IRBL 問題的研究開始逐步升溫.在2014 年,Ye 等人[51]共享了Birt、Tomcat 等新的缺陷定位數(shù)據(jù)集,Wang 等人[100]還提供了一個便于研究人員比較和復(fù)現(xiàn)缺陷定位技術(shù)的實驗平臺BOAT.這些公開數(shù)據(jù)集及共享實驗代碼的增多,使得IRBL 問題成為當(dāng)前軟件缺陷定位領(lǐng)域的一個研究熱點,并產(chǎn)生了很多高質(zhì)量的研究成果.接下來,本文將對這些數(shù)據(jù)集進(jìn)行簡要介紹.

      有研究表明:Bugzilla 中的缺陷報告與修復(fù)代碼是弱關(guān)聯(lián)的;而JIRA 中的缺陷報告與修復(fù)代碼則關(guān)聯(lián)明顯,主要因為JIRA 提供了附件幫助關(guān)聯(lián)問題(issue)和版本控制系統(tǒng)中的提交[101].本文對由JIRA 管理的數(shù)據(jù)集和其他數(shù)據(jù)集分別進(jìn)行介紹.

      在上述數(shù)據(jù)集中,由JIRA 管理的數(shù)據(jù)集有Lucene、JBOSS、APACHE、Derby 和Pig 等.其中,

      · Lucene 是一個開放源代碼的全文檢索引擎工具包.在缺陷定位研究中使用的Lucene 版本和報告數(shù)不盡相同,有的研究中包含2 443 個缺陷報告,有的則只包含30 個缺陷報告.

      · JBOSS 是一個基于J2EE 的開放源代碼的應(yīng)用服務(wù)器,Lal 等人[12]抽取了569 個缺陷報告,Lee 等人[102]則對JBoss 中不同項目(例如ENTESB、JBMETA、ELY、SWARM、WFARQ 等)分別抽取缺陷報告,構(gòu)建多個數(shù)據(jù)集,缺陷報告從1 個到984 個不等.

      · APACHE 是一個Web 服務(wù)器軟件,目前在Web 服務(wù)器軟件中全世界使用率第一,Lal 等人[12]抽取了637個缺陷報告.

      · Derby 是一個完全使用java 編寫的數(shù)據(jù)庫系統(tǒng).

      · Pig 是一種數(shù)據(jù)流語言,Moreno 等人[20]在研究中各抽取了2 個版本、累計129 和133 個缺陷報告進(jìn)行實驗.

      在缺陷定位研究中,這些數(shù)據(jù)集存在多個版本,研究人員基于實際需要選擇特定版本內(nèi)的缺陷報告作為實驗對象.

      對于其他數(shù)據(jù)集,多數(shù)軟件項目都是使用Bugzilla 作為缺陷跟蹤系統(tǒng),少部分使用Github 管理缺陷報告或問題報告.其中,AspectJ、SWT、Eclipse、JDT、Birt、PDE 和Eclipse Platform 等都來自開源軟件項目Eclipse,Tomcat則是Jakarta 項目中的一個核心項目,這些軟件項目都是由Bugzilla 管理的.Zxing 是一個開放源碼的,用Java 實現(xiàn)的多種格式的1D/2D 條碼圖像處理庫,其缺陷管理工具是Github,包含20 個缺陷報告.

      從以上統(tǒng)計可發(fā)現(xiàn):即使是相同的軟件項目,由于不同研究人員的需求不同,使用的缺陷報告也不盡相同.同一個缺陷報告,根據(jù)研究人員定位要求的不同,缺陷報告關(guān)聯(lián)的缺陷程序模塊粒度也會不同.以后隨著公開數(shù)據(jù)集的增多,對IRBL 方法的普適性和通用性研究可在更多數(shù)據(jù)集中驗證.

      7 總結(jié)

      目前,基于信息檢索的缺陷定位雖然已經(jīng)取得了一定的研究進(jìn)展,但缺陷定位的準(zhǔn)確率和可靠度還有待提高,這也是當(dāng)前軟件缺陷定位研究成果難以成功應(yīng)用到企業(yè)軟件質(zhì)量保障流程的主要阻礙之一.雖然有一些缺陷定位工具[103]被實現(xiàn)出來給開發(fā)人員使用,但距離被多數(shù)開發(fā)人員認(rèn)可還存在一定的距離.對基于信息檢索的缺陷定位的研究具有豐富的理論研究價值和工業(yè)界應(yīng)用前景,我們認(rèn)為,IRBL 還存在很多值得國內(nèi)研究人員關(guān)注的研究問題.本文將依次從數(shù)據(jù)源、檢索模型、場景應(yīng)用這3 個維度對未來研究工作進(jìn)行展望.

      (1) 針對數(shù)據(jù)源的研究展望

      通過對評測數(shù)據(jù)集采集過程的分析,我們發(fā)現(xiàn)在挖掘軟件歷史倉庫的過程中,對程序模塊進(jìn)行類型標(biāo)記時可能會產(chǎn)生噪音.這些噪音的存在會影響缺陷定位模型的構(gòu)建,并對已有實證研究結(jié)論的有效性產(chǎn)生嚴(yán)重影響.

      · 首先,將缺陷報告從問題報告中識別出時就可能產(chǎn)生噪音.Herzig 等人[104]指出:在問題跟蹤系統(tǒng)中大量問題報告被錯誤分類,接近1/3 被標(biāo)記為缺陷的問題報告不是真的缺陷報告.他們指出,這種偏差嚴(yán)重影響了對基于歷史先驗缺陷的缺陷預(yù)測研究.

      · 其次,將版本控制系統(tǒng)中的修改日志與缺陷跟蹤系統(tǒng)中的缺陷報告建立鏈接關(guān)系時容易產(chǎn)生噪音.例如:通過在提交日志中搜索特定關(guān)鍵詞(例如fixed 或bug)和缺陷ID 號(例#53322)可建立一種鏈接關(guān)系,隨后,基于該鏈接關(guān)系將代碼修改涉及的程序模塊標(biāo)記為缺陷模塊,與缺陷報告對應(yīng)起來.但并不是所有修改的程序模塊都是有缺陷的,有些程序模塊變更是一些非必要變更.

      除了數(shù)據(jù)集的Ground Truth 的可靠性問題,數(shù)據(jù)集中的缺陷報告質(zhì)量也存在巨大差異,對IRBL 有顯著影響.Kochhar 等人[99]就此分析了IRBL 中存在的潛在偏見,實驗結(jié)果表明:缺陷報告錯誤分類的影響是可以忽略不計的;而因建立鏈接關(guān)系造成的不準(zhǔn)確的Ground Truth 對缺陷定位結(jié)果的影響也不大;顯著地影響缺陷定位結(jié)果的是那些已定位的缺陷報告.已定位的缺陷報告指那些文本描述中已經(jīng)指定包含缺陷程序模塊文本的報告,這些已定位報告不需要額外的缺陷定位方法.實驗表明:那些已定位或部分定位的缺陷報告比那些非已定位的缺陷報告準(zhǔn)確率高得多,對缺陷定位性能影響很大.

      針對數(shù)據(jù)集的質(zhì)量問題,研究人員可以在收集數(shù)據(jù)集時選擇由JIRA 管理的軟件項目,加強(qiáng)缺陷報告和修復(fù)提交的關(guān)聯(lián),以提高缺陷數(shù)據(jù)集的質(zhì)量.針對缺陷報告的質(zhì)量問題,一方面,在用戶提交缺陷報告時對缺陷報告的質(zhì)量進(jìn)行把關(guān),有研究人員考慮在用戶提交缺陷報告時檢測缺失信息并給出反饋[61];另一方面,針對低質(zhì)量的缺陷報告,可通過查詢重構(gòu)等方式來提高缺陷定位性能.Lawrie 等人[69]分析了基于遺傳算法的查詢重構(gòu)方法,發(fā)現(xiàn)該方法的優(yōu)化目標(biāo)主要基于查詢性能指標(biāo),因此存在一定的作弊問題.他們采用了基于自動總結(jié)的方法,并分析了該方法在不作弊的情況下是否可以進(jìn)行高質(zhì)量的查詢重構(gòu).結(jié)果表明,該方法的效果還有待提高.雖然上述方法對數(shù)據(jù)集質(zhì)量進(jìn)行了初步的探索,但如何進(jìn)一步提升缺陷報告質(zhì)量以提高最終的缺陷定位效果,仍是一個亟待解決的問題.

      (2) 針對檢索模型的研究展望

      目前,針對檢索模型的研究存在多個問題.

      · 首先,檢索模型的缺陷定位準(zhǔn)確性和實際應(yīng)用的需求存在較大差距,仍有較大的提升空間.研究人員可引入軟件缺陷預(yù)測等領(lǐng)域的知識,設(shè)計與缺陷報告和缺陷程序模塊相關(guān)的軟件特征,提高缺陷定位準(zhǔn)確率;同時,IRBL 作為一個檢索問題,可進(jìn)一步引入信息檢索領(lǐng)域內(nèi)的最新研究成果,充分利用來自Stack Overflow 的眾包知識、API 文檔和軟件項目文檔等來改進(jìn)模型,輔助解決缺陷報告和缺陷程序模塊的詞不匹配問題.

      · 其次,目前的檢索模型很少探討訓(xùn)練數(shù)據(jù)不足的問題.當(dāng)開發(fā)人員團(tuán)隊開發(fā)一個新的軟件項目時,新項目會存在訓(xùn)練數(shù)據(jù)不足的問題,這需要利用其他軟件項目的訓(xùn)練數(shù)據(jù)來建立模型.但不同項目的訓(xùn)練數(shù)據(jù)因項目的管理方式、人員構(gòu)成、采用的編程語言不同,會存在較大的數(shù)據(jù)分布差異.因此,如何借助遷移學(xué)習(xí)方法來緩解這種數(shù)據(jù)分布差異問題,是一個研究難點.Huo 等人[105]在這個方面進(jìn)行了嘗試,首次提出了跨項目缺陷定位方法,通過一個深度遷移學(xué)習(xí)模型,解決目標(biāo)項目訓(xùn)練數(shù)據(jù)不足的問題.該方法主要包含遷移特征提取層和項目指定預(yù)測層:在遷移特征提取層,通過CNN 共享權(quán)重參數(shù)的方式將知識從原項目遷移到目標(biāo)項目;在項目指定預(yù)測層,通過兩個全連接層共同訓(xùn)練原項目和目標(biāo)項目.

      · 最后,隨著軟件快速頻繁地演化,如果每次演化后都需要重新訓(xùn)練檢索模型,則存在過程重復(fù)并且訓(xùn)練費(fèi)時費(fèi)力等問題,因此,模型的增量更新是一種有效的解決方案.對此,Rao 等人[64]提出一個增量更新框架,使用每次軟件演化中的所有代碼變更信息來持續(xù)地更新索引和模型,對VSM 模型和SUM 提出索引更新方法和增量更新規(guī)則.實驗結(jié)果表明,該方法僅需額外花費(fèi)少量時間即可獲得同樣的檢索準(zhǔn)確率.Rao 等人[106]隨后又比較了兩種基于LSI 的增量更新方法iLSI 和iSVD,隨著項目的演化,可以增量更新模型的參數(shù).

      在軟件項目的不同階段會遇到不同的問題,采用合適的IRBL 方法以適應(yīng)軟件開發(fā)過程、保障軟件質(zhì)量,是一個值得探索的方向.

      (3) 針對場景應(yīng)用的研究展望

      目前,IRBL 方法大多基于Java 語言開發(fā)的軟件工程項目,對其他類型語言的軟件項目研究較少.面向?qū)ο笳Z言和面向過程語言對編程風(fēng)格和習(xí)慣有很大影響,其對缺陷定位造成的影響很值得研究.為此,Saha 等人[65]探索了IRBL 在C 語言上的有效性.他們拓展了BLUiR 方法用于C 語言的缺陷定位,實驗結(jié)果表明:在C 語言軟件項目上,基于IR 的缺陷定位方法一樣有效;不過,部分軟件特征如結(jié)構(gòu)信息等,對C 語言軟件項目的益處并不大.

      Garnier 等人[107]對先前工作中數(shù)據(jù)集存在的問題進(jìn)行了改進(jìn),在20 個C#軟件項目上,評估BLUiR、BLUiR+和AmaLgam 方法的有效性:首先是版本選擇問題,實驗中找到缺陷報告創(chuàng)建前的提交版本,確保每個缺陷報告都定位到其對應(yīng)的版本;然后是缺陷報告選擇問題,排除已定位缺陷報告的出現(xiàn);最后是程序模塊選擇問題,移除用于測試的程序模塊.實驗結(jié)果表明:基于IR 的缺陷定位方法在C#軟件項目上依然有效,并且將更多的程序構(gòu)造(如字符串文字、接口、枚舉類型等)加入結(jié)構(gòu)化信息檢索的考慮之中,能有效提高缺陷定位性能.除基于C和C#開發(fā)的項目外,IRBL 方法在基于其他編程語言開發(fā)的軟件項目上的缺陷定位性能仍需要進(jìn)一步探討.

      除了從橫向維度進(jìn)行拓展,模型也可從縱向維度進(jìn)行考慮.當(dāng)前,文件級別的缺陷定位數(shù)據(jù)集是最多的,函數(shù)和代碼變更級別的缺陷定位數(shù)據(jù)集較少.因此,研究人員可以繼續(xù)挖掘、搜集和共享更多細(xì)粒度的數(shù)據(jù)集,分析IRBL 方法在相關(guān)數(shù)據(jù)集上的有效性[79],并通過提高細(xì)粒度缺陷定位的性能,以滿足開發(fā)人員的實際定位需求,促進(jìn)軟件缺陷定位的研究成果應(yīng)用到工業(yè)界中.

      若能對上述研究挑戰(zhàn)提出有效的解決方案,將使得軟件缺陷定位更好地應(yīng)用于項目開發(fā)和維護(hù)過程,并有助于快速定位缺陷程序模塊,減輕開發(fā)人員負(fù)擔(dān),最終提高軟件產(chǎn)品的質(zhì)量.

      猜你喜歡
      程序模塊代碼報告
      樂高M(jìn)INDSTORMSEV3軟件程序模塊開發(fā)
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      基于Web網(wǎng)絡(luò)的環(huán)境信息通信系統(tǒng)設(shè)計
      ADSP TS201S Link口在多DSP系統(tǒng)中的應(yīng)用
      一圖看懂十九大報告
      報告
      基于S120伺服驅(qū)動模塊111報文的西門子S7-300程序模塊設(shè)計
      额尔古纳市| 永靖县| 诸城市| 迁安市| 湛江市| 千阳县| 丰镇市| 兰西县| 衢州市| 资兴市| 黔江区| 巴里| 德阳市| 建瓯市| 和政县| 奎屯市| 鞍山市| 明溪县| 商城县| 双峰县| 华容县| 晋宁县| 班玛县| 六枝特区| 汉沽区| 兴安盟| 永和县| 应城市| 梅河口市| 铜山县| 本溪市| 丹巴县| 丰顺县| 鸡西市| 大城县| 交城县| 英吉沙县| 柞水县| 咸宁市| 申扎县| 嘉祥县|