楊豐玉,黃雅璇,周世健,鄭 巍
1.南昌航空大學(xué) 軟件學(xué)院,南昌330063
2.南昌航空大學(xué) 軟件測(cè)評(píng)中心,南昌330063
軟件缺陷是指軟件產(chǎn)品的結(jié)果不符合軟件要求或最終用戶(hù)期望。它通常會(huì)以非預(yù)期的方式產(chǎn)生不正確或意外的結(jié)果和行為。軟件日益增加的復(fù)雜性和依賴(lài)性增加了軟件高質(zhì)量、低成本和可維護(hù)的難度,以及創(chuàng)建軟件缺陷的可能性。軟件缺陷預(yù)測(cè)[1]是在測(cè)試之前識(shí)別出易出錯(cuò)的樣本,達(dá)到提高軟件質(zhì)量的目的,它能自動(dòng)檢測(cè)出最可能出現(xiàn)錯(cuò)誤的代碼區(qū)域中的潛在缺陷,有效地優(yōu)化有限資源的分配以進(jìn)行測(cè)試和維護(hù)。
缺陷預(yù)測(cè)在軟件質(zhì)量保證中起著重要作用,是近年軟件測(cè)試領(lǐng)域的研究重點(diǎn)之一。軟件缺陷預(yù)測(cè)包括兩個(gè)階段[2]:從源文件中提取度量指標(biāo),使用各種機(jī)器學(xué)習(xí)算法構(gòu)建缺陷預(yù)測(cè)模型。首先從軟件歷史倉(cāng)庫(kù)中創(chuàng)建數(shù)據(jù)樣本,根據(jù)樣本是否包含缺陷,可以將其標(biāo)記為有缺陷或無(wú)缺陷。然后,用機(jī)器學(xué)習(xí)算法構(gòu)建缺陷預(yù)測(cè)模型。最后,預(yù)測(cè)測(cè)試樣本是否有缺陷。利用預(yù)測(cè)模型,開(kāi)發(fā)人員可以有效地在缺陷樣本上分配可用的測(cè)試資源,以便在開(kāi)發(fā)生命周期的早期階段提高軟件質(zhì)量。如圖1所示。
圖1 軟件缺陷預(yù)測(cè)過(guò)程
其中,軟件歷史倉(cāng)庫(kù)包含版本控制系統(tǒng)和缺陷跟蹤系統(tǒng),版本控制系統(tǒng)包含源代碼和文件變更信息,缺陷跟蹤系統(tǒng)包含缺陷信息。軟件歷史倉(cāng)庫(kù)中每個(gè)樣本的粒度包含方法、類(lèi)、文件、變更和包級(jí)別等,根據(jù)預(yù)測(cè)粒度,每個(gè)樣本可以表示為一個(gè)方法、一個(gè)類(lèi)、一個(gè)源代碼文件、一個(gè)程序包或一個(gè)代碼更改。一個(gè)樣本通常包含許多缺陷預(yù)測(cè)度量指標(biāo),度量指標(biāo)表示軟件及其開(kāi)發(fā)過(guò)程的復(fù)雜性。
由于度量指標(biāo)的質(zhì)量會(huì)直接影響缺陷預(yù)測(cè)的效率和準(zhǔn)確性,現(xiàn)如今提取度量指標(biāo)的方法主要分為兩個(gè)方面:一方面手動(dòng)設(shè)計(jì)新的判別度量指標(biāo)或組合度量指標(biāo),另一方面使用深度學(xué)習(xí)挖掘源代碼中復(fù)雜的非線性特征,這些特征可以很好地表達(dá)源代碼的語(yǔ)義和結(jié)構(gòu)。
目前已有一些研究人員從不同方面對(duì)缺陷預(yù)測(cè)的相關(guān)研究工作進(jìn)行梳理和歸納[3-7],李勇等人[4]從數(shù)據(jù)驅(qū)動(dòng)的角度對(duì)基于版本內(nèi)數(shù)據(jù)、跨版本數(shù)據(jù)和跨項(xiàng)目數(shù)據(jù)實(shí)現(xiàn)缺陷預(yù)測(cè)進(jìn)行分類(lèi)歸納,陳翔等人[3,5]對(duì)靜態(tài)軟件缺陷預(yù)測(cè)方法和跨項(xiàng)目軟件缺陷預(yù)測(cè)進(jìn)行歸納和分析,蔡亮等人[6]從數(shù)據(jù)標(biāo)注、特征提取、模型構(gòu)建和模型評(píng)估等人方面對(duì)即時(shí)軟件缺陷預(yù)測(cè)進(jìn)行梳理歸納,宮麗娜等人[7]從數(shù)據(jù)集、構(gòu)建方法、評(píng)價(jià)指標(biāo)等多個(gè)角度對(duì)軟件缺陷預(yù)測(cè)進(jìn)行全面總結(jié)。
與此不同的是,本文側(cè)重度量指標(biāo)的選擇,對(duì)多元度量指標(biāo)缺陷預(yù)測(cè)已有研究進(jìn)行歸納總結(jié),并總結(jié)了當(dāng)前存在的主要問(wèn)題和未來(lái)發(fā)展方向。主要通過(guò)IEEE Xplore Digital Library、ACM Digital Library、Springer Link online Library、Elsevier ScienceDirect及CNKI等在線數(shù)據(jù)庫(kù)進(jìn)行檢索,檢索關(guān)鍵詞主要包括software defect prediction和software fault prediction等,最終選出與該研究問(wèn)題直接相關(guān)的論文共73篇(截止到2020年10月)。
軟件度量指標(biāo)是影響缺陷預(yù)測(cè)質(zhì)量的核心因素,若設(shè)計(jì)與缺陷強(qiáng)相關(guān)性的度量指標(biāo)將很大幅度地提高缺陷預(yù)測(cè)的準(zhǔn)確度。源代碼是一種特殊的形式語(yǔ)言,包含豐富的語(yǔ)義和結(jié)構(gòu)信息,根據(jù)源代碼信息和軟件開(kāi)發(fā)過(guò)程中的復(fù)雜性,現(xiàn)有的度量指標(biāo)分為代碼度量和過(guò)程度量[8]。代碼度量是直接收集現(xiàn)有源代碼,主要度量源代碼的代碼規(guī)模和復(fù)雜性等屬性,具有越高復(fù)雜度的軟件模塊更容易出現(xiàn)缺陷。從存儲(chǔ)在版本控制系統(tǒng)和缺陷跟蹤系統(tǒng)的歷史信息中提取的信息稱(chēng)為過(guò)程度量,這些度量量化了隨著時(shí)間變化的軟件開(kāi)發(fā)過(guò)程,如源代碼變更、代碼更改的數(shù)量、開(kāi)發(fā)人員信息等。表1列出了常見(jiàn)的用于軟件缺陷預(yù)測(cè)的代碼度量和過(guò)程度量。
表1 常見(jiàn)的傳統(tǒng)度量指標(biāo)
1.1.1 傳統(tǒng)代碼度量
常用的傳統(tǒng)度量指標(biāo)有代碼行(LOC)[9],基于運(yùn)算符和操作數(shù)的Halstead度量[10],基于依賴(lài)性的McCabe度量[11],面向?qū)ο蟪绦虻腃K度量[12],基于多態(tài)性因子、耦合因子的MOOD度量[13]和代碼氣味度量[14]。除此之外,Aman等人[15]證明了注釋行也能作為分析模塊缺陷的度量指標(biāo)。Majd等人[16]引入了32種新的語(yǔ)句級(jí)別的代碼度量指標(biāo),該預(yù)測(cè)模型可以預(yù)測(cè)某條語(yǔ)句可能存在多少缺陷。
但是,并非所有的傳統(tǒng)代碼度量都對(duì)缺陷預(yù)測(cè)有利,冗余和無(wú)關(guān)度量會(huì)增加模型構(gòu)建時(shí)間,甚至降低模型性能,如何選擇合適的指標(biāo)是問(wèn)題的關(guān)鍵。研究人員已嘗試用特征選擇來(lái)解決該問(wèn)題,特征選擇旨在選擇特征子集來(lái)替換原始特征集[17],此特征子集能更有效地區(qū)分軟件模塊的類(lèi)別標(biāo)簽。由于存在多種特征選擇方法,比較不同特征選擇方法的有效性變得至關(guān)重要。Chen等人[18]基于搜索的軟件工程的思想,將特征選擇形式化為一個(gè)多目標(biāo)問(wèn)題并進(jìn)行多目標(biāo)優(yōu)化。他們考慮了兩個(gè)目標(biāo),一個(gè)是盡可能少地選擇特征,另一個(gè)是盡可能提高缺陷預(yù)測(cè)模型的性能。Xu等人[19]對(duì)32種不同的特征選擇方法進(jìn)行了大規(guī)模的實(shí)驗(yàn),最后確定出一組優(yōu)秀的特征選擇方法。隨后,他們提出了一種稱(chēng)為KPWE的缺陷預(yù)測(cè)框架[20],該框架結(jié)合了基于核函數(shù)的主成分分析(Kernel Principal Component Analysis,KPCA)和加權(quán)極限學(xué)習(xí)機(jī)算法(Weighted Extreme Learning Machine,WELM)。首先,KPWE利用KPCA技術(shù)的非線性映射將原始數(shù)據(jù)投影到潛在特征空間,在空間中映射的特征可以很好地表示原始特征。其次,通過(guò)映射特性,KPWE應(yīng)用WELM來(lái)構(gòu)建一個(gè)高效且有效的缺陷預(yù)測(cè)模型,該模型可以處理不平衡的缺陷數(shù)據(jù)。
1.1.2傳統(tǒng)過(guò)程度量
近年來(lái),研究者提出了許多代表性過(guò)程度量,如相對(duì)代碼更改攪動(dòng)指標(biāo)[21]、開(kāi)發(fā)者網(wǎng)絡(luò)和社交網(wǎng)絡(luò)指標(biāo)[22]、依賴(lài)圖指標(biāo)[23]和組織結(jié)構(gòu)指標(biāo)[24]等。其中,研究工作集中在如何利用軟件模塊之間的依賴(lài)關(guān)系,構(gòu)建網(wǎng)絡(luò)度量指標(biāo)[22-23,25-26]。
一個(gè)軟件系統(tǒng)包括許多實(shí)體和元素,例如類(lèi)、函數(shù)和變量。因此,如果將軟件系統(tǒng)的元素視為節(jié)點(diǎn),將關(guān)系視為網(wǎng)絡(luò)系統(tǒng)的邊緣,就可以將其轉(zhuǎn)換為網(wǎng)絡(luò)系統(tǒng)。許多軟件網(wǎng)絡(luò)的拓?fù)涮卣髋c缺陷密切相關(guān),可以用作軟件缺陷預(yù)測(cè)的指標(biāo)。例如,Zimmermann等人[23]基于Windows Server 2003生成了模塊依賴(lài)關(guān)系圖并對(duì)該圖進(jìn)行了網(wǎng)絡(luò)分析。該研究定義了局部、全局和中心網(wǎng)絡(luò)指標(biāo),并表明依賴(lài)圖上的網(wǎng)絡(luò)度量指標(biāo)可用于預(yù)測(cè)缺陷數(shù)量。實(shí)驗(yàn)表明,網(wǎng)絡(luò)度量指標(biāo)在預(yù)測(cè)關(guān)鍵二進(jìn)制文件和缺陷方面比復(fù)雜性指標(biāo)更好。隨后,Premraj等人[27]復(fù)制了Zimmermann等人[23]的實(shí)驗(yàn),揭示在代價(jià)感知和CPDP方面,網(wǎng)絡(luò)度量指標(biāo)并不優(yōu)于代碼度量。因此,Ma等人[28]對(duì)11個(gè)具有不同規(guī)模、編程語(yǔ)言和應(yīng)用程序域的開(kāi)源項(xiàng)目的多個(gè)版本進(jìn)行研究,與Premraj等人[27]不同的是,他們發(fā)現(xiàn)大多數(shù)網(wǎng)絡(luò)度量指標(biāo)都與缺陷傾向顯著正相關(guān),并且網(wǎng)絡(luò)度量指標(biāo)對(duì)于大型和復(fù)雜項(xiàng)目更為有效,而在小型項(xiàng)目中則不穩(wěn)定。
Yang等人[29]基于軟件元素之間的關(guān)系及其演化關(guān)系建立了一個(gè)面向?qū)ο蟮能浖W(wǎng)絡(luò),并建立了許多度量指標(biāo)來(lái)宏觀地描述軟件模塊。此外,一些研究人員認(rèn)為可以將開(kāi)發(fā)人員活動(dòng)交互視為軟件網(wǎng)絡(luò),組成網(wǎng)絡(luò)度量。Meneely等人[22]使用一套新的基于開(kāi)發(fā)人員社交網(wǎng)絡(luò)的開(kāi)發(fā)人員指標(biāo),如果兩個(gè)開(kāi)發(fā)人員在同一時(shí)間段內(nèi)處理相同的文件,則將其連接在一起。結(jié)果發(fā)現(xiàn)基于文件的開(kāi)發(fā)人員指標(biāo)與軟件缺陷之間的顯著相關(guān)性。
代碼度量和過(guò)程度量都能建立缺陷預(yù)測(cè)模型,但是,代碼度量和過(guò)程度量誰(shuí)更優(yōu)存在不同爭(zhēng)論。Arisholm等人[30]分析了不同度量指標(biāo)對(duì)模型預(yù)測(cè)性能的影響,結(jié)果表明若選擇不同的性能評(píng)價(jià)指標(biāo),結(jié)果將相反。Moser等人[31]發(fā)現(xiàn)若使用Eclipse數(shù)據(jù)集,過(guò)程度量的效果比代碼度量更好。Rahman等人[32]從多個(gè)角度分析了代碼度量和過(guò)程度量的適用性和有效性,結(jié)果表明代碼度量有很高的滯后性,不如過(guò)程指標(biāo)有用。
根據(jù)數(shù)據(jù)來(lái)源不同,軟件缺陷預(yù)測(cè)可分為同項(xiàng)目缺陷預(yù)測(cè)(Within Project Defect Prediction,WPDP)和跨項(xiàng)目缺陷預(yù)測(cè)(Cross-Project Defect Prediction,CPDP)。WPDP指在帶標(biāo)簽的樣本上訓(xùn)練模型,并對(duì)同一項(xiàng)目中其余未標(biāo)記的樣本執(zhí)行預(yù)測(cè)。CPDP是指從其他項(xiàng)目中遷移出與目標(biāo)項(xiàng)目相關(guān)的知識(shí)進(jìn)行訓(xùn)練。目前最流行、應(yīng)用最廣泛的缺陷預(yù)測(cè)建模方法是機(jī)器學(xué)習(xí)方法[33],將基于傳統(tǒng)度量指標(biāo)的缺陷預(yù)測(cè)文獻(xiàn)大致分為以下四類(lèi):有監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)、半監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)、無(wú)監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)和跨項(xiàng)目缺陷預(yù)測(cè)。
1.2.1 有監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)
有監(jiān)督學(xué)習(xí)方法是指在項(xiàng)目中使用帶有標(biāo)簽的缺陷數(shù)據(jù)來(lái)訓(xùn)練分類(lèi)或回歸模型,然后用該模型確定新軟件模塊的缺陷信息。如人工神經(jīng)網(wǎng)絡(luò)[34-35]、貝葉斯網(wǎng)絡(luò)[36]、支持向量機(jī)[37]、字典學(xué)習(xí)[38]、關(guān)聯(lián)規(guī)則[39]、樸素貝葉斯[40]、隨機(jī)森林[41]、遺傳算法[42]和集成學(xué)習(xí)[43]。
Xu等人[44]提出一個(gè)基于深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,DNN)的學(xué)習(xí)深度特征表示框架,并向DNN引入了一種混合損失函數(shù)以學(xué)習(xí)更多具有區(qū)分度的特征,結(jié)果表明,在同項(xiàng)目缺陷預(yù)測(cè)可以獲得更好的性能。Yang等人[45]提出結(jié)合決策樹(shù)和集成學(xué)習(xí)的雙層集成學(xué)習(xí)方法來(lái)構(gòu)建即時(shí)缺陷預(yù)測(cè)模型。該方法在內(nèi)層使用基于決策樹(shù)的裝袋集成學(xué)習(xí)方法來(lái)構(gòu)建隨機(jī)森林模型,在外層使用隨機(jī)抽樣的方法來(lái)訓(xùn)練不同的隨機(jī)森林模型,然后按照堆疊方式來(lái)集成這些不同的隨機(jī)森林模型。Qiu等人[46]利用DNN從傳統(tǒng)特征中自動(dòng)學(xué)習(xí)高維特征表示,然后用決策森林進(jìn)行分類(lèi),主要解決了以端到端方法結(jié)合神經(jīng)網(wǎng)絡(luò)和決策森林的問(wèn)題。
1.2.2 半監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)
半監(jiān)督學(xué)習(xí)方法是通過(guò)在項(xiàng)目中僅使用少量標(biāo)簽的訓(xùn)練數(shù)據(jù)和大量沒(méi)有標(biāo)簽的數(shù)據(jù)來(lái)構(gòu)建缺陷預(yù)測(cè)模型。He等人[47]提出了半監(jiān)督學(xué)習(xí)方法extRF,該方法通過(guò)自我訓(xùn)練模式擴(kuò)展了有監(jiān)督的隨機(jī)森林算法。首先從數(shù)據(jù)集中抽取小部分?jǐn)?shù)據(jù)作為有標(biāo)簽的數(shù)據(jù)集,使用這小部分?jǐn)?shù)據(jù)集訓(xùn)練隨機(jī)森林分類(lèi)器,根據(jù)訓(xùn)練好的分類(lèi)器去預(yù)測(cè)未標(biāo)記的數(shù)據(jù)集,然后選擇最好的樣本加入到訓(xùn)練集中,并進(jìn)行訓(xùn)練初始模型,以此類(lèi)推,最后形成精煉模型。Zhang等人[48]提出了一種基于非負(fù)稀疏圖的標(biāo)簽傳播方法進(jìn)行缺陷預(yù)測(cè)。首先對(duì)標(biāo)記的無(wú)缺陷實(shí)例重新采樣以生成平衡的訓(xùn)練數(shù)據(jù)集,并使用非負(fù)稀疏圖算法計(jì)算關(guān)系圖的權(quán)重以更好地學(xué)習(xí)數(shù)據(jù)關(guān)系。最后,在非負(fù)稀疏圖中,使用標(biāo)簽傳播算法來(lái)迭代預(yù)測(cè)未標(biāo)記的軟件模塊。Arshad等人[49]提出了一種基于半監(jiān)督的深度模糊C均值聚類(lèi)的特征提取方法,該方法通過(guò)利用未標(biāo)記和標(biāo)記數(shù)據(jù)集的深度多聚類(lèi)來(lái)生成新特征。Wu等人[50]介紹了半監(jiān)督詞典學(xué)習(xí)技術(shù)并提出了一種成本敏感的內(nèi)核化半監(jiān)督詞典學(xué)習(xí)(Cost-sensitive Kernelized Semisupervised Dictionary Learning,CKSDL)方法,CKSDL可以充分利用內(nèi)核空間中有限的標(biāo)記缺陷數(shù)據(jù)和大量未標(biāo)記數(shù)據(jù),在16個(gè)項(xiàng)目上進(jìn)行大量實(shí)驗(yàn),結(jié)果表明,該方法在WPDP和CPDP上都具有較好的預(yù)測(cè)性能。
1.2.3 無(wú)監(jiān)督學(xué)習(xí)缺陷預(yù)測(cè)
無(wú)監(jiān)督學(xué)習(xí)方法不需要有標(biāo)簽的訓(xùn)練數(shù)據(jù),它們直接利用項(xiàng)目中的未標(biāo)記數(shù)據(jù)來(lái)學(xué)習(xí)缺陷預(yù)測(cè)模型。對(duì)新項(xiàng)目或沒(méi)有足夠歷史數(shù)據(jù)的項(xiàng)目進(jìn)行缺陷預(yù)測(cè)是一個(gè)具有挑戰(zhàn)性的問(wèn)題,為了解決這個(gè)問(wèn)題,Nam和Kim[51]提出CLA和CLAMI方法,CLA方法對(duì)樣本進(jìn)行聚集和標(biāo)記,CLAMI方法在CLA基礎(chǔ)上還進(jìn)行了度量選擇和樣本選擇,其關(guān)鍵思想是通過(guò)度量值大小來(lái)標(biāo)記沒(méi)有標(biāo)簽的數(shù)據(jù)集。隨后,Yan等人[52]擴(kuò)展了CLAMI樣本聚集部分,在14個(gè)開(kāi)源項(xiàng)目上評(píng)估了這種無(wú)監(jiān)督方法,結(jié)果表明,無(wú)監(jiān)督方法可以產(chǎn)生比有監(jiān)督方法更好的效果。由于頻譜聚類(lèi)是基于連通性的無(wú)監(jiān)督聚類(lèi)方法,不需要訓(xùn)練數(shù)據(jù),Zhang等人[53]利用頻譜聚類(lèi)解決CPDP中源項(xiàng)目和目標(biāo)項(xiàng)目之間的異質(zhì)性,發(fā)現(xiàn)使用頻譜聚類(lèi)的無(wú)監(jiān)督學(xué)習(xí)方法在CPDP和WPDP場(chǎng)景下都有可比較性。
1.2.4 跨項(xiàng)目缺陷預(yù)測(cè)
在實(shí)際情況下,目標(biāo)項(xiàng)目可能沒(méi)有任何標(biāo)記樣本的新項(xiàng)目,或者這個(gè)項(xiàng)目的標(biāo)記樣本較少,不足以訓(xùn)練高質(zhì)量的缺陷預(yù)測(cè)模型。如果直接使用從其他項(xiàng)目(即源項(xiàng)目)收集的帶標(biāo)簽數(shù)據(jù)并且不執(zhí)行任何數(shù)據(jù)預(yù)處理,訓(xùn)練后的模型的性能可能不佳,因?yàn)樵诖蠖鄶?shù)情況下,不同項(xiàng)目之間的數(shù)據(jù)分布無(wú)法滿(mǎn)足。因此,研究人員設(shè)計(jì)了不同的方法[54]來(lái)緩解跨項(xiàng)目情況下的數(shù)據(jù)分布差異。
Pan等人[55]提出一種遷移成分分析(Transfer Component Analysis,TCA)方法,通過(guò)最小化數(shù)據(jù)分布之間的距離的同時(shí)保留住原始數(shù)據(jù)屬性,為源項(xiàng)目和目標(biāo)項(xiàng)目的數(shù)據(jù)發(fā)現(xiàn)新的特征表示,并根據(jù)新的特征表示對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換。結(jié)果顯示,TCA可以減小數(shù)據(jù)分布差異。然后,Nam等人[56]提出了TCA+,將源項(xiàng)目和目標(biāo)項(xiàng)目映射到共享的潛在空間中,使它們之間的數(shù)據(jù)分布距離很近,以提升跨項(xiàng)目缺陷預(yù)測(cè)的性能。
常規(guī)的CPDP始終假定源項(xiàng)目和目標(biāo)項(xiàng)目使用相同的度量標(biāo)準(zhǔn)集。研究人員考慮到通用指標(biāo)的數(shù)量可能很小,或者在通用指標(biāo)中沒(méi)有高質(zhì)量的指標(biāo),在目標(biāo)項(xiàng)目中尋找源項(xiàng)目的相同指標(biāo)有一定難度等問(wèn)題,他們提出異構(gòu)缺陷預(yù)測(cè)(Heterogeneous Defect Prediction,HDP)方法。He等人[57]提出一種特征集不平衡的CPDP(Cross-Project Defect Prediction Imbalanced Feature Sets,CPDP-IFS)方法,該方法提出了16個(gè)基于分布特征的新指標(biāo)。隨后,Nam等人[58]提出一種HDP方法,通過(guò)計(jì)算不同項(xiàng)目中源度量指標(biāo)和目標(biāo)度量指標(biāo)的匹配分?jǐn)?shù),刪除冗余無(wú)關(guān)的特征,找到相似性高的匹配度量指標(biāo)。實(shí)驗(yàn)結(jié)果表明,使用該方法,即使項(xiàng)目使用不同的度量集,也有可能快速地遷移關(guān)于缺陷預(yù)測(cè)的信息??梢宰钚』错?xiàng)目和目標(biāo)項(xiàng)目之間的數(shù)據(jù)分布差異。
Li等人[59]提出集成多核相關(guān)對(duì)齊(Ensemble Multiple Kernel Correlation Alignment,EMKCA)方法,通過(guò)多次內(nèi)核學(xué)習(xí)將源項(xiàng)目和目標(biāo)項(xiàng)目數(shù)據(jù)映射到高維內(nèi)核空間中,并利用內(nèi)核相關(guān)性對(duì)齊方法減少源項(xiàng)目和目標(biāo)項(xiàng)目的數(shù)據(jù)分布,最后集成了多個(gè)內(nèi)核分類(lèi)器用來(lái)解決類(lèi)不平衡問(wèn)題。實(shí)驗(yàn)結(jié)果顯示,該方法能更好地分離高維內(nèi)核空間中的有缺陷和無(wú)缺陷的模塊。隨后,他們提出一種代價(jià)敏感遷移核規(guī)范相關(guān)分析(Cost-sensitive Transfer Kernel Canonical Correlation Analysis,CTKCCA)方法[60],設(shè)計(jì)用于HDP的遷移核規(guī)范相關(guān)分析方法解決線性不可分問(wèn)題,利用代價(jià)敏感緩解類(lèi)不平衡問(wèn)題。實(shí)驗(yàn)表明,CTKCCA可以使非線性特征空間中的源項(xiàng)目和目標(biāo)項(xiàng)目的數(shù)據(jù)分布更加相似,且學(xué)習(xí)的特征具有良好的分離性。之后,他們擴(kuò)展了先前的研究[59],提出兩階段集成學(xué)習(xí)方法[61],該方法包含集成多內(nèi)核域自適應(yīng)(Ensemble Multi-kernel Domain Adaptation,EMDA)階段和集成數(shù)據(jù)采樣(Ensemble Data Sampling,EDS)階段。EMDA階段使用EMKCA預(yù)測(cè)器,EDS階段采用帶有替換技術(shù)的重采樣學(xué)習(xí)多個(gè)EMKCA預(yù)測(cè)器,并使用平均集成將它們組合在一起。
軟件缺陷預(yù)測(cè)的數(shù)據(jù)可以來(lái)源于開(kāi)源項(xiàng)目和商業(yè)項(xiàng)目,現(xiàn)有的常用公開(kāi)數(shù)據(jù)集包括PROMISE、NASA[62]、AEEEM[63]、SOFTLAB[64]和ReLink[65]等。有少量文獻(xiàn)和企業(yè)合作使用了商業(yè)項(xiàng)目[66]。
數(shù)據(jù)質(zhì)量對(duì)缺陷預(yù)測(cè)性能有著巨大的影響,數(shù)據(jù)集中常包含一些降低預(yù)測(cè)模型性能的問(wèn)題,如關(guān)鍵特征選擇和類(lèi)不平衡等。
1.3.1 數(shù)據(jù)集
表2 匯總了研究文獻(xiàn)所用的數(shù)據(jù)集,以下對(duì)常用的數(shù)據(jù)集進(jìn)行簡(jiǎn)短介紹。
表2 數(shù)據(jù)集
PROMISE:自2005年以來(lái)收集了一些開(kāi)源項(xiàng)目和一些研究人員自發(fā)提供的項(xiàng)目的缺陷信息構(gòu)成PROMISE Repository。至今,該數(shù)據(jù)集包含38個(gè)開(kāi)源項(xiàng)目,其中類(lèi)級(jí)軟件度量指標(biāo)有20個(gè)。
NASA:NASA MDP數(shù)據(jù)集包含13個(gè)NASA軟件項(xiàng)目的方法級(jí)軟件度量指標(biāo)。在這13個(gè)數(shù)據(jù)集中,一個(gè)用Java(KC3)編寫(xiě),其余使用C/C++。這些數(shù)據(jù)集中的缺陷率范圍從0.5%(PC2)到32.3%(MC2)。此外,這些數(shù)據(jù)集中的度量指標(biāo)并不完全相同,其中一些包含其他指標(biāo)。在該組數(shù)據(jù)集中,CM1、KC3、MC2、MW1、PC1、PC2、PC3和PC4有40個(gè)度量指標(biāo),MC1和PC5包含39個(gè)度量指標(biāo),JM1、KC1、KC2有21個(gè)度量指標(biāo)。
AEEEM:AEEEM數(shù)據(jù)集包含五個(gè)開(kāi)源項(xiàng)目(Eclipse JDT Core、Eclipse PDE UI、Equinox Framework、Mylyn、Apache Lucence)。每個(gè)數(shù)據(jù)集包含61個(gè)軟件度量指標(biāo),包括面向?qū)ο笾笜?biāo)和變更度量指標(biāo)。
SOFTLAB:SOFTLAB由嵌入式控制器AR1、AR2、AR3、AR4、AR5和AR6項(xiàng)目組成,這些項(xiàng)目從PROMISE中獲得。每個(gè)數(shù)據(jù)集包含29個(gè)度量指標(biāo),其中包括Halstead和McCabe度量指標(biāo)。
ReLink:ReLink中包含三個(gè)數(shù)據(jù)集Apache HTTP Server、OpenIntents Safe和ZXing。這些數(shù)據(jù)集包含26個(gè)軟件度量指標(biāo),并且手動(dòng)驗(yàn)證了缺陷標(biāo)簽。
ELEF:ELEF數(shù)據(jù)集[67]一共有23個(gè)Java開(kāi)源項(xiàng)目,包含了類(lèi)級(jí)和方法級(jí)度量指標(biāo),其中類(lèi)級(jí)度量指標(biāo)有39個(gè),方法級(jí)度量指標(biāo)有26個(gè)。
NetGen:NetGen是Herzig等人[68]收集的變更級(jí)數(shù)據(jù)集,此數(shù)據(jù)集由四個(gè)開(kāi)源項(xiàng)目組成,總共有456個(gè)度量指標(biāo),包括與文件歷史相關(guān)的復(fù)雜性度量指標(biāo)、網(wǎng)絡(luò)度量指標(biāo)和變更度量指標(biāo)。
1.3.2 關(guān)鍵特征選擇
維數(shù)爆炸是影響缺陷預(yù)測(cè)模型性能的問(wèn)題之一,特征選擇方法能夠從高維特征中選取具有代表性的特征子集,避免不相關(guān)或冗余特征帶來(lái)的分類(lèi)干擾。為了解決這個(gè)問(wèn)題,Jia[69]提出了一種結(jié)合了不同特征分類(lèi)技術(shù)的混合特征選擇方法,該方法根據(jù)卡方、信息增益、Pearson相關(guān)系數(shù)對(duì)特征進(jìn)行排序并使用隨機(jī)森林構(gòu)建預(yù)測(cè)模型。Balogun等人[70]提出特征選擇的影響取決于搜索方法的選擇,使用四種不同的分類(lèi)器對(duì)NASA的五個(gè)數(shù)據(jù)集進(jìn)行了四種篩選特征排序和十四種篩選特征子集選擇方法的評(píng)估。實(shí)驗(yàn)表明,基于特征排序的缺陷預(yù)測(cè)在預(yù)測(cè)性能方面更加穩(wěn)定。
Liu等人[71]提出一種基于特征聚類(lèi)和特征排名的新特征選擇框架(Feature Clustering and Feature Ranking,F(xiàn)ECAR),根據(jù)特征間的相關(guān)性將原始特征劃分為k個(gè)聚類(lèi),使內(nèi)部聚類(lèi)特征高度相關(guān)。然后,從每個(gè)聚類(lèi)中選擇相關(guān)特征并按照相關(guān)性排序構(gòu)建最終特征子集,實(shí)驗(yàn)表明,該方法有效地處理了冗余和不相關(guān)的特征。Xu等人[72]提出層次聚類(lèi)的最大信息系數(shù)特征系數(shù)框架(Maximal Information Coefficient with Hierarchical Agglomerative Clustering,MICHAC),MICHAC利用最大信息系數(shù)對(duì)候選特征進(jìn)行排序,過(guò)濾不相關(guān)的特征;然后,采用分層聚類(lèi)的方法對(duì)特征進(jìn)行分組,并從每一組特征中選取一個(gè)特征來(lái)去除冗余特征。
1.3.3 類(lèi)不平衡
類(lèi)不平衡問(wèn)題是指至少一個(gè)類(lèi)別比其他類(lèi)別多。在軟件缺陷數(shù)據(jù)集中,缺陷模塊要少于非缺陷模塊,因此不平衡缺陷數(shù)據(jù)集上訓(xùn)練的模型通常偏向于非缺陷類(lèi)模塊,而忽略了缺陷類(lèi)模塊。類(lèi)不平衡問(wèn)題是軟件缺陷預(yù)測(cè)模型性能差的主要原因之一。隨機(jī)欠采樣和過(guò)采樣技術(shù)已被廣泛使用[73-74],但是它們的準(zhǔn)確性取決于現(xiàn)有數(shù)據(jù)和分類(lèi)算法,為了普遍緩解類(lèi)不平衡問(wèn)題帶來(lái)的影響,Bennin等人[75]提出了一種基于染色體遺傳理論的新型高效合成過(guò)采樣方法(MAHAKIL),MAHAKIL將兩個(gè)不同的子類(lèi)解釋為父類(lèi),并生成一個(gè)新實(shí)例,該實(shí)例從每個(gè)父類(lèi)繼承不同特征并有助于數(shù)據(jù)分布內(nèi)的多樣性。為了同時(shí)解決類(lèi)不平衡問(wèn)題和支持向量機(jī)(Support Vector Machines,SVM)的參數(shù)選擇問(wèn)題,Cai等人[76]提出了一種基于支持向量機(jī)的混合多目標(biāo)布谷鳥(niǎo)搜索欠采樣軟件缺陷預(yù)測(cè)模型,利用混合多目標(biāo)布谷鳥(niǎo)搜索與動(dòng)態(tài)局部搜索來(lái)同步選擇無(wú)缺陷采樣并優(yōu)化SVM的參數(shù)。然后,該模型提出了三種欠采樣方法來(lái)選擇無(wú)缺陷的模塊。結(jié)果顯示,提出的方法對(duì)解決類(lèi)不平衡問(wèn)題生效。Huda等人[77]集成了隨機(jī)欠采樣和過(guò)采樣方法解決類(lèi)不平衡問(wèn)題,并在PROMISE數(shù)據(jù)集上驗(yàn)證了所提出的方法的有效性。
表3 列出了基于傳統(tǒng)度量指標(biāo)的研究文獻(xiàn)使用的度量指標(biāo)和數(shù)據(jù)集。
過(guò)去的幾十年已經(jīng)提出了多種研究人員手工設(shè)計(jì)的傳統(tǒng)度量指標(biāo)來(lái)區(qū)分有缺陷和無(wú)缺陷文件[78-79]。隨著研究的逐漸深入,研究人員發(fā)現(xiàn)傳統(tǒng)度量指標(biāo)主要關(guān)注代碼復(fù)雜性,通常無(wú)法區(qū)分具有不同語(yǔ)義的程序,不能完全捕獲源代碼中的復(fù)雜語(yǔ)義信息和度量指標(biāo)之間的潛在關(guān)聯(lián)[80-81]。
近些年,深度學(xué)習(xí)方法已成功解決許多自然語(yǔ)言處理問(wèn)題,包括解析、機(jī)器翻譯、情感分析和自動(dòng)問(wèn)答等。有學(xué)者[73]將深度學(xué)習(xí)引申到軟件缺陷預(yù)測(cè)中,開(kāi)始嘗試?yán)蒙疃葘W(xué)習(xí)自動(dòng)捕獲程序的語(yǔ)義表示和度量指標(biāo)之間的潛在關(guān)聯(lián)(即語(yǔ)法結(jié)構(gòu)),得到源代碼語(yǔ)義度量指標(biāo)和結(jié)構(gòu)度量指標(biāo)。從數(shù)據(jù)挖掘角度來(lái)看,軟件度量指標(biāo)可視為特征,傳統(tǒng)度量指標(biāo)可稱(chēng)為傳統(tǒng)特征,語(yǔ)義度量指標(biāo)可稱(chēng)為語(yǔ)義特征,結(jié)構(gòu)度量指標(biāo)可稱(chēng)為結(jié)構(gòu)特征。
傳統(tǒng)代碼度量主要關(guān)注程序的統(tǒng)計(jì)特征,并假定有缺陷的軟件模塊和無(wú)缺陷的模塊具有可區(qū)分的統(tǒng)計(jì)特征和面向?qū)ο筇卣?。但是,研究者[80]通過(guò)對(duì)實(shí)際開(kāi)發(fā)的軟件模塊觀察發(fā)現(xiàn),現(xiàn)有的傳統(tǒng)代碼度量指標(biāo)無(wú)法區(qū)分不同語(yǔ)義的模塊,即具有不同語(yǔ)義軟件模塊可能具有相似或相同的傳統(tǒng)代碼度量指標(biāo)。例如,在圖2中,有兩個(gè)Java文件,兩個(gè)文件都包含一個(gè)for語(yǔ)句和兩個(gè)函數(shù)調(diào)用。使用傳統(tǒng)度量來(lái)表示這兩個(gè)代碼段時(shí),它們的特征向量是相同的,但是,語(yǔ)義信息明顯不同。如果隊(duì)列為空,調(diào)用remove()時(shí),F(xiàn)ile2.java將遇到異常,需要建立更準(zhǔn)確的預(yù)測(cè)模型來(lái)區(qū)分此類(lèi)語(yǔ)義差異的模塊。為了捕獲源代碼中的復(fù)雜語(yǔ)義信息和語(yǔ)法結(jié)構(gòu),Wang等人[80]首次提出利用深度學(xué)習(xí)從源代碼中提取語(yǔ)義特征。
表3 研究文獻(xiàn)中度量指標(biāo)和數(shù)據(jù)集(一)
圖2 例子
2.1.1 從抽象語(yǔ)法樹(shù)捕獲語(yǔ)義度量
目前,現(xiàn)有常用的提取方法是將源代碼轉(zhuǎn)化為抽象語(yǔ)法樹(shù)(Abstract Syntax Tree,AST)。AST是代碼在計(jì)算機(jī)內(nèi)存的一種樹(shù)狀數(shù)據(jù)結(jié)構(gòu),用于描述代碼上下文關(guān)系。AST可以有效地存儲(chǔ)語(yǔ)義信息和語(yǔ)法結(jié)構(gòu)[82],有助于準(zhǔn)確地分析和定位缺陷。利用深度學(xué)習(xí)來(lái)挖掘AST的隱藏特征可以生成更能體現(xiàn)代碼上下文信息的度量指標(biāo),從而更準(zhǔn)確地預(yù)測(cè)軟件缺陷。
Wang等人[80]先將源代碼解析為AST,然后利用深度置信網(wǎng)絡(luò)(Deep Belief Network,DBN)從AST節(jié)點(diǎn)中提取token向量并生成語(yǔ)義特征。隨后,他們從源代碼變更中提取語(yǔ)義特征,對(duì)變更級(jí)的軟件缺陷預(yù)測(cè)進(jìn)行了擴(kuò)展[83]。Li等人[81]將傳統(tǒng)特征與卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)學(xué)習(xí)的語(yǔ)義特征相結(jié)合,以構(gòu)建一個(gè)混合預(yù)測(cè)模型。為了更好地利用AST的樹(shù)結(jié)構(gòu)并在源代碼中反映語(yǔ)法和語(yǔ)義的多個(gè)層次,在記錄AST的聲明節(jié)點(diǎn)時(shí),沒(méi)有記錄節(jié)點(diǎn)名稱(chēng),而是提取節(jié)點(diǎn)的值來(lái)構(gòu)建token向量。隨后,邱少健等人[84]采用三層卷積神經(jīng)網(wǎng)絡(luò)提取源代碼潛在語(yǔ)義特征,并用代價(jià)敏感對(duì)數(shù)據(jù)進(jìn)行處理解決了類(lèi)不平衡問(wèn)題。Pan等人[85]在此基礎(chǔ)上進(jìn)行了改進(jìn),將CNN模型的全連接層增加為四個(gè),還添加了三個(gè)dropout層防止模型過(guò)擬合。結(jié)果表明,改進(jìn)的CNN模型在WPDP方面明顯優(yōu)于最新的機(jī)器學(xué)習(xí)模型。為了從程序中捕獲語(yǔ)義信息,Liang等人[86]構(gòu)建了一種基于長(zhǎng)短期記憶網(wǎng)絡(luò)(Long Short Term Memory networks,LSTM)的缺陷預(yù)測(cè)框架,該框架采用了連續(xù)詞袋(Continuous Bag-Of-Words Model,CBOW)來(lái)學(xué)習(xí)程序AST的向量表示,其拋棄了傳統(tǒng)的機(jī)器學(xué)習(xí)模型,而是采用LSTM來(lái)構(gòu)建缺陷預(yù)測(cè)模型。
程序中的上下文語(yǔ)義至關(guān)重要,但CNN無(wú)法捕獲長(zhǎng)距離特征,F(xiàn)an等人[87]開(kāi)始采用具有注意力機(jī)制的遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)來(lái)區(qū)分關(guān)鍵語(yǔ)法結(jié)構(gòu)和語(yǔ)義特征。先從AST中提取的token向量中自動(dòng)學(xué)習(xí)語(yǔ)義特征,再用注意力機(jī)制進(jìn)一步捕獲重要特征并賦予更高的權(quán)重,使訓(xùn)練更準(zhǔn)確。結(jié)果表明,缺陷預(yù)測(cè)模型性能得到了提升。與Liang等人[86]不同的是,Deng等人[88]并沒(méi)有選擇LSTM構(gòu)建缺陷預(yù)測(cè)模型,而是利用雙向長(zhǎng)短期記憶網(wǎng)絡(luò)的長(zhǎng)距離依賴(lài)特性更好地學(xué)習(xí)上下文語(yǔ)義特征。因?yàn)門(mén)ransformer突出的并行計(jì)算能力,Zhang等人[89]嘗試使用Transformer捕獲向量中特定位置的關(guān)鍵特征。
上述從AST節(jié)點(diǎn)中提取token向量過(guò)程中,通常選擇遍歷AST來(lái)進(jìn)行序列化,但這種方式會(huì)損失一定的語(yǔ)義信息。一些研究人員嘗試通過(guò)其他方法將AST序列化,從而捕獲更全面的語(yǔ)義特征。例如,F(xiàn)an等人[90]基于四個(gè)開(kāi)源Android應(yīng)用程序,從AST中提取高頻關(guān)鍵字獲得基于規(guī)則的編程模式,使用DBN從編程模式中學(xué)習(xí)源代碼的內(nèi)部信息。實(shí)驗(yàn)結(jié)果表明,該方法學(xué)習(xí)到的特征能比傳統(tǒng)特征預(yù)測(cè)更多缺陷。Dam等人[91]認(rèn)為遍歷AST沒(méi)有完全編碼代碼的語(yǔ)義和語(yǔ)法結(jié)構(gòu),提出了一個(gè)基于樹(shù)的長(zhǎng)短期記憶網(wǎng)絡(luò)(TB-LSTM)模型來(lái)獲取整個(gè)AST的向量表示。為了避免AST序列化的損失,該模型直接使用樹(shù)形LSTM匹配AST表示,將每個(gè)AST節(jié)點(diǎn)都輸入LSTM單元,在Samsung項(xiàng)目和公共PROMISE數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果證實(shí)了其有效性。Shi等人[92]認(rèn)為接近的源代碼之間存在很強(qiáng)的語(yǔ)義相關(guān)性,提出短路徑的概念來(lái)描述每個(gè)終端節(jié)點(diǎn)及其控制邏輯,并使用成對(duì)的短路徑描述代碼的語(yǔ)義信息,并通過(guò)注意力機(jī)制將它們?nèi)诤显谝黄?,在PROMISE數(shù)據(jù)集上進(jìn)行實(shí)驗(yàn)表明,該方法比TB-LSTM具有更好的性能。Rahman等人[93]通過(guò)分析AST得到代碼配置文件,使用代碼配置文件作為語(yǔ)義特征代替?zhèn)鹘y(tǒng)度量指標(biāo)來(lái)改進(jìn)缺陷預(yù)測(cè)。在Eclipse數(shù)據(jù)集和Github缺陷數(shù)據(jù)庫(kù)進(jìn)行實(shí)驗(yàn),結(jié)果表明,在版本內(nèi)缺陷預(yù)測(cè)中該方法比傳統(tǒng)度量指標(biāo)更好,而在跨版本缺陷預(yù)測(cè)中表現(xiàn)不佳。
考慮到細(xì)粒度級(jí)別的預(yù)測(cè)可能更能準(zhǔn)確定位預(yù)測(cè)的缺陷,Shippey等人[94]使用AST n-gram來(lái)識(shí)別有缺陷的Java代碼特征。將模塊中每個(gè)Java方法進(jìn)行AST序列化,再將方法序列按照字節(jié)進(jìn)行大小為N的滑動(dòng)窗口操作,形成長(zhǎng)度為N的字節(jié)片段序列,這個(gè)字節(jié)片段序列稱(chēng)為AST n-gram。結(jié)果表明,AST n-gram在某些系統(tǒng)中與缺陷非常相關(guān),對(duì)預(yù)測(cè)模型影響很大,某些頻繁出現(xiàn)的AST n-gram意味著該方法包含缺陷的可能性比其他方法提高了三倍。曹靖[95]試圖考慮更細(xì)粒度的預(yù)測(cè),他將代碼缺陷定位在代碼行,從AST中提取指定類(lèi)的實(shí)例的API調(diào)用序列,預(yù)測(cè)API序列中的API誤用缺陷。
2.1.2 其他方式捕獲語(yǔ)義度量
一些研究者認(rèn)為,AST序列化不能完全表達(dá)源代碼語(yǔ)義,開(kāi)始嘗試通過(guò)其他方式從源代碼中捕獲語(yǔ)義特征。Phan等人[96]認(rèn)為AST僅表示源代碼的抽象語(yǔ)法結(jié)構(gòu),不顯示程序的執(zhí)行過(guò)程,該方法通過(guò)編譯源代碼獲取匯編指令構(gòu)造控制流程圖(Control Flow Graph,CFG),然后利用基于多視圖多層有向圖的卷積神經(jīng)網(wǎng)絡(luò)在CFG上學(xué)習(xí)語(yǔ)義特征,結(jié)果表明與基于AST的語(yǔ)義特征相比,基于CFG的語(yǔ)義特征性能更好。Zhang等人[97]將交叉熵作為一種新的代碼度量引入缺陷預(yù)測(cè)中,該方法利用LSTM挖掘代碼語(yǔ)料庫(kù),捕獲程序中常見(jiàn)模式和規(guī)律,然后將模型輸入到token序列的聯(lián)合概率分布中得到軟件模塊的交叉熵,實(shí)驗(yàn)結(jié)果表明,交叉熵符合代碼自然性,對(duì)傳統(tǒng)代碼度量進(jìn)行很好的補(bǔ)充。隨后,在此基礎(chǔ)上,他們進(jìn)行了擴(kuò)展研究,提出了代碼抽象語(yǔ)法樹(shù)節(jié)點(diǎn)序列交叉熵(CE-AST)[98],結(jié)果表明,CE-AST具有更大的區(qū)分力。
Scandariato等人[99]將Android源代碼中的Java文件看作文本,采用詞袋模型統(tǒng)計(jì)文件中相關(guān)詞的頻率,用符號(hào)特征生成缺陷特征向量。針對(duì)Android源代碼難以獲取的問(wèn)題,Dong等人[100]從Android二進(jìn)制可執(zhí)行文件中提取符號(hào)特征和語(yǔ)義特征來(lái)構(gòu)建缺陷預(yù)測(cè)模型,結(jié)果表明,該方法在WPDP中的準(zhǔn)確率比CPDP更高。
Okutan等人[101]從抄襲和克隆檢測(cè)技術(shù)中得到啟發(fā),從源代碼中學(xué)習(xí)到一種新的語(yǔ)義度量指標(biāo)。他們發(fā)現(xiàn)源文件的語(yǔ)法或語(yǔ)義相似度與其缺陷傾向性可能存在關(guān)聯(lián),基于這種假設(shè),他們?yōu)槊總€(gè)文件計(jì)算相似性度量指標(biāo)得到源文件之間的相似性,用這些相似性度量指標(biāo)來(lái)預(yù)測(cè)特定文件是否有缺陷。Huo等人[102]認(rèn)為注釋可以視為源代碼的另一個(gè)視圖,幫助生成語(yǔ)義特征,這些語(yǔ)義特征反映了用于識(shí)別缺陷模塊的代碼特征。但由于部分開(kāi)發(fā)人員的習(xí)慣,有些項(xiàng)目的注釋很少,為了克服這個(gè)問(wèn)題,他們構(gòu)建了一種基于注釋增強(qiáng)程序的卷積神經(jīng)網(wǎng)絡(luò)(CAP-CNN)的缺陷預(yù)測(cè)模型,該網(wǎng)絡(luò)可以在訓(xùn)練過(guò)程中自動(dòng)編碼和吸收注釋信息以自動(dòng)生成語(yǔ)義特征,實(shí)驗(yàn)結(jié)果表明,注釋特征能夠提高缺陷預(yù)測(cè)性能。
為了避免AST序列化過(guò)程中損失語(yǔ)義信息,Humphreys等人[103]直接將源代碼作為序列輸入到深度學(xué)習(xí)模型中,由于源代碼文件組成成千上萬(wàn)個(gè)token,并且代碼區(qū)域之間的距離很長(zhǎng),因?yàn)樾枰芸焖偬幚黹L(zhǎng)距離依賴(lài)關(guān)系的深度學(xué)習(xí)模型,該研究使用transformer從長(zhǎng)序列中提取語(yǔ)義特征并證明了模型的可解釋性。Miholca等人[104]提出一種將漸進(jìn)關(guān)系關(guān)聯(lián)規(guī)則與人工神經(jīng)網(wǎng)絡(luò)相結(jié)合的混合分類(lèi)模型,該模型可以根據(jù)從源代碼中自動(dòng)學(xué)習(xí)的語(yǔ)義特征來(lái)預(yù)測(cè)缺陷。
2.1.3 基于CPDP的語(yǔ)義度量指標(biāo)
在以前利用深度學(xué)習(xí)捕獲語(yǔ)義特征的研究中[80-81],沒(méi)有考慮項(xiàng)目之間語(yǔ)義特征分布差異的影響,因此,Lin等人[105]嘗試將從現(xiàn)有軟件項(xiàng)目獲取的語(yǔ)義表示遷移到新項(xiàng)目中,為了驗(yàn)證方法的可行性,手動(dòng)標(biāo)記了457個(gè)缺陷特征,并從6個(gè)開(kāi)源項(xiàng)目中收集了30 000多個(gè)非缺陷特征。實(shí)驗(yàn)結(jié)果證實(shí),訓(xùn)練后的模型能跨多個(gè)項(xiàng)目進(jìn)行調(diào)整。Chen等人[106]設(shè)計(jì)了一種基于雙向長(zhǎng)短期記憶網(wǎng)絡(luò)和注意力機(jī)制的CPDP方法,提出一種新的無(wú)監(jiān)督嵌入算法自動(dòng)學(xué)習(xí)了從AST中提取的token向量的有意義表示,最后利用雙向長(zhǎng)短期記憶網(wǎng)絡(luò)和注意力機(jī)制學(xué)習(xí)上下文語(yǔ)義特征。在不同的應(yīng)用程序域的10個(gè)開(kāi)源項(xiàng)目中進(jìn)行實(shí)驗(yàn)表明,該方法可以應(yīng)用在CPDP。
為了最小化項(xiàng)目之間的分類(lèi)誤差和分布差異,Qiu等人[107]將源和目標(biāo)項(xiàng)目特定數(shù)據(jù)的隱藏表示形式嵌入到再生內(nèi)核Hilbert空間中進(jìn)行分布匹配,然后將源文件解析的整數(shù)向量放入CNN中生成語(yǔ)義特征。Deng等人[108]探索了更合適CPDP的AST節(jié)點(diǎn)粒度并在CNN中添加多內(nèi)核匹配層以最小化源和目標(biāo)項(xiàng)目的數(shù)據(jù)分布差異。Sheng等人[109]提出了對(duì)抗判別卷積神經(jīng)網(wǎng)絡(luò),通過(guò)欺騙甄別器來(lái)學(xué)習(xí)目標(biāo)項(xiàng)目到源項(xiàng)目特征空間的判別映射。
與Dam等人[91]類(lèi)似的是,Cai等人[110]基于樹(shù)的嵌入,將AST節(jié)點(diǎn)編碼為向量并在再生內(nèi)核Hilbert空間中遷移不同項(xiàng)目的特征,其中還測(cè)量了AST之間的語(yǔ)義差距,最后將編碼后的AST饋入神經(jīng)網(wǎng)絡(luò)提取語(yǔ)義和結(jié)構(gòu)特征。
若僅關(guān)注代碼度量,使用文件或類(lèi)粒度的統(tǒng)計(jì)特征或語(yǔ)義特征,會(huì)忽略軟件模塊的宏觀完整性,破壞軟件模塊元素之間的相互影響。相比需要人工建立的傳統(tǒng)網(wǎng)絡(luò)度量指標(biāo),研究人員試圖使用網(wǎng)絡(luò)嵌入等方法對(duì)軟件系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行分析。
網(wǎng)絡(luò)嵌入是將軟件網(wǎng)絡(luò)嵌入到低維空間,其中每個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)都表示為低維向量,這種低維嵌入已經(jīng)解決了很多問(wèn)題,例如節(jié)點(diǎn)分類(lèi)、鏈路預(yù)測(cè)和個(gè)性化推薦。目前,大量的網(wǎng)絡(luò)嵌入算法已成功應(yīng)用于網(wǎng)絡(luò)表示學(xué)習(xí)中,包括DeepWalk[111]、Node2vec[112]和LINE[113]。這些算法對(duì)代碼文件之間依賴(lài)關(guān)系形成的軟件網(wǎng)絡(luò)進(jìn)行表示性學(xué)習(xí),提取軟件模塊的結(jié)構(gòu)特征進(jìn)行缺陷預(yù)測(cè)。
與Meneely等人[22]的研究工作相似的是,Loyola等人[114]用開(kāi)發(fā)人員活動(dòng)數(shù)據(jù)構(gòu)建了依賴(lài)關(guān)系圖,但該研究沒(méi)有使用傳統(tǒng)網(wǎng)絡(luò)度量,而是將依賴(lài)關(guān)系圖中每個(gè)節(jié)點(diǎn)進(jìn)行截?cái)嗟碾S機(jī)游走,從數(shù)據(jù)中自動(dòng)學(xué)習(xí)表示。結(jié)果表明,數(shù)據(jù)的表示形式會(huì)極大地影響缺陷預(yù)測(cè)的性能。Qu等人[115]提出一種node2defect的方法,該方法先構(gòu)造了分析程序的類(lèi)依賴(lài)網(wǎng)絡(luò)(Class Dependency Network,CDN),然后使用node2vec自動(dòng)學(xué)習(xí)CDN的結(jié)構(gòu)特征。最后將該特征和傳統(tǒng)代碼度量結(jié)合形成新特征,實(shí)驗(yàn)結(jié)果表明,node2defect方法可以顯著提高軟件缺陷的預(yù)測(cè)能力。
與網(wǎng)絡(luò)嵌入不同的是,一些研究者試圖用其他方法對(duì)依賴(lài)關(guān)系圖進(jìn)行學(xué)習(xí),Qu等人[116]采用k-core算法分析CDN上的缺陷分布,他們發(fā)現(xiàn)具有越大k值的類(lèi),有更大幾率存在缺陷,根據(jù)結(jié)果對(duì)軟件模塊的所有類(lèi)進(jìn)行排列能幫助測(cè)試人員更快速地找到缺陷。田永清[117]將系統(tǒng)依賴(lài)圖進(jìn)行程序切片,得到程序結(jié)構(gòu)的向量表示,然后利用門(mén)控循環(huán)單元神經(jīng)網(wǎng)絡(luò)提取網(wǎng)絡(luò)特征。
一些研究者將語(yǔ)義度量指標(biāo)和結(jié)構(gòu)度量指標(biāo)混合使用。Meilong等人[118]用CNN從AST中自動(dòng)學(xué)習(xí)語(yǔ)義特征,再基于軟件模塊之間的依賴(lài)關(guān)系構(gòu)建了網(wǎng)絡(luò)模型,并用node2vec進(jìn)行隨機(jī)游走得到結(jié)構(gòu)特征。最后將語(yǔ)義特征和結(jié)構(gòu)特征組合進(jìn)行缺陷預(yù)測(cè),實(shí)證結(jié)果表明,語(yǔ)義特征和結(jié)構(gòu)特征的混合是目前軟件缺陷預(yù)測(cè)的首選。同樣,劉成斌等人[119]基于Apache的三個(gè)開(kāi)源軟件項(xiàng)目將語(yǔ)義特征和結(jié)構(gòu)特征進(jìn)行混合預(yù)測(cè),這兩項(xiàng)研究為多元度量指標(biāo)提供了有效的研究思路。
基于語(yǔ)義結(jié)構(gòu)度量指標(biāo)的缺陷預(yù)測(cè)的研究重點(diǎn)在提取更合適的度量,為了與傳統(tǒng)度量指標(biāo)進(jìn)行對(duì)比,研究人員對(duì)WPDP的模型構(gòu)建和數(shù)據(jù)質(zhì)量部分選擇和基于傳統(tǒng)度量指標(biāo)的缺陷預(yù)測(cè)保持一致,沒(méi)有改進(jìn)。
綜上所述,研究人員對(duì)度量指標(biāo)的提取進(jìn)行了大量研究,主要包括傳統(tǒng)代碼度量、傳統(tǒng)網(wǎng)絡(luò)度量、語(yǔ)義度量、結(jié)構(gòu)度量和其他過(guò)程度量。其中,這些度量指標(biāo)體現(xiàn)了軟件模塊不同角度的信息,從現(xiàn)有研究來(lái)看,混合多元度量指標(biāo)能使缺陷預(yù)測(cè)模型最大程度上精確。表4列出了基于語(yǔ)義結(jié)構(gòu)度量指標(biāo)的研究文獻(xiàn)使用的度量指標(biāo)和數(shù)據(jù)集。
表4 研究文獻(xiàn)中度量指標(biāo)和數(shù)據(jù)集(二)
為了判斷構(gòu)建的缺陷預(yù)測(cè)模型的性能,研究人員提出了多種評(píng)價(jià)指標(biāo),但在實(shí)際開(kāi)發(fā)過(guò)程中,沒(méi)有充足的時(shí)間和資源審查代碼。為了將精力集中在最有可能發(fā)生缺陷的模塊上,開(kāi)發(fā)人員提出了代價(jià)感知(effort-aware)指標(biāo)。而相對(duì)地,機(jī)器學(xué)習(xí)領(lǐng)域常用來(lái)缺陷預(yù)測(cè)模型的指標(biāo)稱(chēng)為非代價(jià)感知(non-effort-aware)指標(biāo)。表5列出了現(xiàn)有研究中使用最廣泛的評(píng)價(jià)指標(biāo)。
在非代價(jià)感知情況下,最常用的模型性能評(píng)價(jià)指標(biāo)是查準(zhǔn)率(Precision)、查全率(Recall)、F-measure和AUC[3,7]。
其中,真正例(TP)表示有缺陷模塊被分類(lèi)器正確標(biāo)記為有缺陷的數(shù)量,真負(fù)例(TN)表示無(wú)缺陷模塊被正確標(biāo)記為無(wú)缺陷的數(shù)量,假正例(FP)是指無(wú)缺陷模塊被錯(cuò)誤地標(biāo)記為有缺陷的數(shù)量,假負(fù)例(FN)是指有缺陷模塊被錯(cuò)誤地標(biāo)記為無(wú)缺陷的數(shù)量。更高的查準(zhǔn)率可以讓開(kāi)發(fā)人員不將調(diào)試工作浪費(fèi)在無(wú)缺陷代碼上,查全率越高說(shuō)明發(fā)現(xiàn)的缺陷越多。F-measure是綜合調(diào)和查準(zhǔn)率和查全率的指標(biāo),用來(lái)衡量缺陷預(yù)測(cè)的性能。
AUC是ROC曲線下面積,ROC是一個(gè)x軸為假正例率,y軸為真正例率的二維曲線,AUC越高,模型性能越好。
表5 評(píng)價(jià)指標(biāo)
準(zhǔn)確率(Accuracy)表示正確預(yù)測(cè)實(shí)例的百分比。
馬修斯相關(guān)系數(shù)(MCC)通過(guò)考慮所有真假的有缺陷數(shù)據(jù)和無(wú)缺陷數(shù)據(jù)來(lái)衡量預(yù)測(cè)結(jié)果和真實(shí)結(jié)果之間的關(guān)系。返回值是[?1,1],其中1表示完美正相關(guān),?1表示完美負(fù)相關(guān)。
在代價(jià)感知情況下,開(kāi)發(fā)人員通常通過(guò)檢查代碼的前20%行來(lái)識(shí)別缺陷百分比,性能評(píng)價(jià)指標(biāo)是PofB20[26]。首先根據(jù)缺陷預(yù)測(cè)模型為每個(gè)實(shí)例生成的置信度,并使用置信度對(duì)測(cè)試數(shù)據(jù)集中的所有實(shí)例進(jìn)行排序,置信度是指被預(yù)測(cè)為缺陷的概率。然后,模擬一個(gè)開(kāi)發(fā)人員來(lái)檢查這些潛在的缺陷實(shí)例,并累積檢查的代碼行和發(fā)現(xiàn)的缺陷數(shù)量。當(dāng)檢查了測(cè)試數(shù)據(jù)中的LOC的20%,并且已發(fā)現(xiàn)錯(cuò)誤的百分比稱(chēng)為PofB20分?jǐn)?shù)時(shí),該過(guò)程將終止。PofB20越高表示在檢查有限代碼行時(shí),開(kāi)發(fā)人員能檢測(cè)到的缺陷越多。
另一個(gè)廣泛使用的代價(jià)感知指標(biāo)是Popt,被定義為1-Δopt,其中Δopt是預(yù)測(cè)模型和最優(yōu)模型之間的面積,用來(lái)描述兩者的偏差,Popt越大預(yù)測(cè)模型越接近最優(yōu)模型,標(biāo)準(zhǔn)化的Popt定義如下:
其中,Area(optimal)、Area(pre_model)、Area(worst)分別表示最優(yōu)模型、預(yù)測(cè)模型和最差模型對(duì)應(yīng)曲線下的面積。
統(tǒng)計(jì)顯著分析方法可以幫助分析兩個(gè)方法是否有統(tǒng)計(jì)學(xué)上的顯著性差異。
(1)Wilcoxon signed-rank test[120]是一種非參數(shù)統(tǒng)計(jì)假設(shè)測(cè)試,用來(lái)比較兩個(gè)相關(guān)樣本,匹配樣本,或?qū)蝹€(gè)樣本重復(fù)測(cè)量,可用于確定是否從具有相同分布的總體中選擇了兩個(gè)相關(guān)樣本。該測(cè)試不需要基礎(chǔ)數(shù)據(jù)遵循任何分布,另外,它可以應(yīng)用于數(shù)據(jù)對(duì),并且能夠?qū)⒉钪蹬c零進(jìn)行比較。在95%置信水平下,p值小于0.05表示受試者之間的差異具有統(tǒng)計(jì)學(xué)意義,而p值大于或等于0.05則表明差異在統(tǒng)計(jì)學(xué)上不顯著。
(2)Scott-Knott ESD test[121]是一種使用層次聚類(lèi)算法進(jìn)行統(tǒng)計(jì)分析的多重比較技術(shù)。本測(cè)試將方法進(jìn)行排序和聚類(lèi),分為差異顯著的組,同一組的方法無(wú)顯著差異,不同組的方法有顯著差異。該測(cè)試的優(yōu)點(diǎn)是,它產(chǎn)生完全不同的組,沒(méi)有任何重疊。
(4)Friedman test[123]是一種非參數(shù)統(tǒng)計(jì)測(cè)試,它是基于績(jī)效值而不是實(shí)際值的排序,測(cè)試統(tǒng)計(jì)量由下式給出:
其中,n表示數(shù)據(jù)集的項(xiàng)目總數(shù),k表示特征選擇方法的總數(shù)表示第i個(gè)方法在第j個(gè)項(xiàng)目排名。
(1)CEπ成本效益[124]是如何有效地使用并行計(jì)算來(lái)解決特定問(wèn)題的指標(biāo)。標(biāo)準(zhǔn)化的成本效益指標(biāo)為:
(2)Win/Tie/Loss用于不同實(shí)驗(yàn)設(shè)置之間的性能比較,當(dāng)對(duì)目標(biāo)項(xiàng)目數(shù)據(jù)集重復(fù)實(shí)驗(yàn)1 000次時(shí),若模型的性能優(yōu)于相應(yīng)基線結(jié)果,標(biāo)記為“Win”,當(dāng)基線結(jié)果更好時(shí),標(biāo)記為“Loss”,如果模型和基線之間沒(méi)有差異,標(biāo)記為“Tie”,根據(jù)Win/Tie/Loss評(píng)估的結(jié)果,可以改進(jìn)模型。
準(zhǔn)確的軟件缺陷預(yù)測(cè)保證了軟件可靠性、提高了軟件測(cè)試效率,本文從多元度量指標(biāo)角度總結(jié)了當(dāng)前軟件缺陷預(yù)測(cè)的相關(guān)工作,并列舉了部分具有代表性的研究文獻(xiàn)。盡管在軟件缺陷預(yù)測(cè)方面已經(jīng)進(jìn)行了很多研究,仍存在許多潛在的挑戰(zhàn)。在這里,對(duì)未來(lái)研究工作進(jìn)行展望。
(1)預(yù)測(cè)粒度的研究展望
現(xiàn)在的研究粒度大部分是文件級(jí),由于文件的長(zhǎng)度,開(kāi)發(fā)人員需要很長(zhǎng)時(shí)間才能找到缺陷,如果發(fā)生誤報(bào),會(huì)過(guò)多地浪費(fèi)資源,所以需要縮小預(yù)測(cè)的缺陷的范圍。更細(xì)粒度的預(yù)測(cè)可以為開(kāi)發(fā)人員提供更少的代碼行,其中方法級(jí)缺陷預(yù)測(cè)有助于預(yù)測(cè)軟件項(xiàng)目中帶有缺陷的方法,但是構(gòu)建方法級(jí)缺陷預(yù)測(cè)模型仍然是一個(gè)挑戰(zhàn)。
(2)傳統(tǒng)軟件度量指標(biāo)的研究展望
過(guò)去幾十年,研究人員提出了大量的傳統(tǒng)代碼度量和過(guò)程度量,但是冗余和無(wú)關(guān)度量指標(biāo)降低模型性能,為了使模型更精確,他們將多種度量指標(biāo)組合并試圖從軟件歷史倉(cāng)庫(kù)中提取更能體現(xiàn)缺陷的新的度量指標(biāo)。如何提出合適的指標(biāo)仍需要進(jìn)一步研究。
(3)基于深度學(xué)習(xí)的軟件度量指標(biāo)的研究展望
近年來(lái),語(yǔ)義度量代替了傳統(tǒng)代碼度量,許多研究表明語(yǔ)義度量構(gòu)建的缺陷預(yù)測(cè)模型比傳統(tǒng)代碼度量預(yù)測(cè)得更準(zhǔn)確。用深度學(xué)習(xí)直接從源代碼中學(xué)習(xí)語(yǔ)義表示過(guò)程,為了將源代碼饋入深度學(xué)習(xí)模型,通常會(huì)損失一些語(yǔ)義信息,哪種方式可以最小限度地減少損失需要進(jìn)一步研究。
(4)跨項(xiàng)目軟件缺陷預(yù)測(cè)度量指標(biāo)的研究展望
對(duì)于新項(xiàng)目或缺少足夠歷史數(shù)據(jù)的項(xiàng)目,研究和使用語(yǔ)義度量來(lái)預(yù)測(cè)缺陷非常有意義。由于源項(xiàng)目和目標(biāo)項(xiàng)目之間存在不同的數(shù)據(jù)分布,因此難以建立可實(shí)現(xiàn)令人滿(mǎn)意性能的良好缺陷預(yù)測(cè)模型。此外,CPDP方面的語(yǔ)義度量提取只是簡(jiǎn)單地遷移了WPDP的方法,沒(méi)有針對(duì)數(shù)據(jù)分布問(wèn)題進(jìn)行更好的可行性研究,若能針對(duì)該問(wèn)題進(jìn)入深入研究,則可以為CPDP方面提供更好的缺陷預(yù)測(cè)模型。