姜元鵬,黃 穎,姜淑娟
1.中國(guó)礦業(yè)大學(xué) 圖書(shū)館,江蘇 徐州 221116
2.中國(guó)礦業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 徐州 221116
軟件缺陷修復(fù)是軟件調(diào)試維護(hù)過(guò)程中的重要環(huán)節(jié),并且隨著軟件復(fù)雜程度的增加以及軟件規(guī)模的擴(kuò)大,人工定位并修復(fù)軟件缺陷越來(lái)越難實(shí)現(xiàn),且面臨成本昂貴、難以修復(fù)等問(wèn)題[1-2]。而利用軟件自動(dòng)修復(fù)方法可以大幅度提高軟件調(diào)試的效率,減少軟件維護(hù)所耗費(fèi)的開(kāi)銷(xiāo)。近年來(lái),隨著深度學(xué)習(xí)技術(shù)的發(fā)展,越來(lái)越多研究人員將深度學(xué)習(xí)方法引入到軟件自動(dòng)修復(fù)領(lǐng)域,軟件自動(dòng)修復(fù)方法成為軟件工程領(lǐng)域研究熱點(diǎn)[3-5]。
目前主要的傳統(tǒng)的軟件自動(dòng)修復(fù)方法可以分為基于搜索的方法與基于語(yǔ)義的方法,國(guó)內(nèi)外專(zhuān)家學(xué)者已經(jīng)重點(diǎn)對(duì)傳統(tǒng)的基于搜索的程序自動(dòng)修復(fù)方法以及基于語(yǔ)義的軟件自動(dòng)修復(fù)方法進(jìn)行了大量研究[6-9];近幾年提出了不少基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法[10-12],基于深度學(xué)習(xí)的軟件修復(fù)方法主要從使用學(xué)習(xí)模型學(xué)習(xí)正確補(bǔ)丁特征、學(xué)習(xí)搜索相似性代碼以及學(xué)習(xí)錯(cuò)誤代碼與正確代碼的轉(zhuǎn)換等角度來(lái)生成正確補(bǔ)丁。
目前的深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法大多是通用的,即不針對(duì)某種特定的缺陷類(lèi)型,更多的是引入深度學(xué)習(xí)模型與相關(guān)的程序分析技術(shù)嘗試修復(fù)軟件代碼中的所有缺陷。而通用的自動(dòng)修復(fù)方法由于針對(duì)性不強(qiáng),因此對(duì)不同類(lèi)型缺陷的修復(fù)效果通常是不同的。在已有的文獻(xiàn)中,部分文獻(xiàn)對(duì)修復(fù)的缺陷進(jìn)行了簡(jiǎn)單的分類(lèi),但是并沒(méi)有系統(tǒng)地對(duì)缺陷庫(kù)中的缺陷進(jìn)行分類(lèi);不同類(lèi)型的缺陷以及補(bǔ)丁具有不同的特征,在基于深度學(xué)習(xí)的程序自動(dòng)修復(fù)方法中,深度學(xué)習(xí)模型的選擇是至關(guān)重要的,因?yàn)椴煌P涂赡芴崛〉奶卣鞑煌?。目前基于不同學(xué)習(xí)模型的程序修復(fù)方法針對(duì)不同類(lèi)型缺陷的修復(fù)偏好尚不明確,在現(xiàn)存的文獻(xiàn)中沒(méi)有關(guān)于基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法以及不同學(xué)習(xí)模型對(duì)不同缺陷類(lèi)型修復(fù)性能的研究,因此,本文擬在對(duì)缺陷分類(lèi)的基礎(chǔ)上通過(guò)分析比較近幾年有代表性的深度學(xué)習(xí)自動(dòng)軟件修復(fù)方法對(duì)不同缺陷類(lèi)型的修復(fù)偏好,可以幫助研究人員更好地了解不同的深度學(xué)習(xí)模型在軟件自動(dòng)修復(fù)當(dāng)中的作用,以便更好地進(jìn)行軟件自動(dòng)修復(fù)工作。
目前幾種比較常用的基于深度學(xué)習(xí)的軟件缺陷修復(fù)工具,其使用的深度學(xué)習(xí)模型包括自編碼器、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、長(zhǎng)短期記憶模型,它們的相關(guān)修復(fù)工具信息如表1所示。
表1 修復(fù)工具信息Table 1 Ⅰnformation about repair tools
表1 的第一列為5 種自動(dòng)修復(fù)工具;第二列是每種修復(fù)工具使用的模型,其中EDM指的是編碼器-解碼器模型(encoder-decoder model,EDM),LSTM-EDM 即為基于LSTM 的編碼器-解碼器模型,同理CNNs-EDM 是指基于CNNs的編碼器-解碼器模型,attention指注意力機(jī)制,copy 則是指復(fù)制機(jī)制;第三列是各種工具工作的代碼粒度,包括了多粒度級(jí)、代碼行以及方法級(jí);最后一列則是各個(gè)工具用于評(píng)估的數(shù)據(jù)集,這5種自動(dòng)修復(fù)工具都在Java程序的缺陷庫(kù)Defects4J[13]上進(jìn)行驗(yàn)證評(píng)估。
DeepRepair[14]工具旨在通過(guò)深度學(xué)習(xí)代碼的相似性排序并轉(zhuǎn)換語(yǔ)句來(lái)推導(dǎo)程序修復(fù)成分,主要使用的學(xué)習(xí)模型為嵌入模型與自編碼器。實(shí)現(xiàn)這一工具的技術(shù)方法可分為三個(gè)階段:語(yǔ)言識(shí)別、機(jī)器學(xué)習(xí)與程序修復(fù)階段。該工具的方法框架如圖1所示。
圖1 DeepRepair方法框架Fig.1 Framework of DeepRepair
SequenceR[15]是一種基于序列到序列的端到端的程序修復(fù)方法,該方法主要使用兩層的雙向長(zhǎng)短期記憶模型。這一技術(shù)主要分為兩個(gè)階段:訓(xùn)練以及推理階段。如圖2為SequenceR的方法框架。
圖2 SequenceR方法框架Fig.2 Framework of SequenceR
CODⅠT[16]使用基于樹(shù)的神經(jīng)網(wǎng)絡(luò)對(duì)源代碼更改進(jìn)行建模并學(xué)習(xí)代碼更改模式,即利用一個(gè)基于樹(shù)神經(jīng)機(jī)器翻譯模型來(lái)學(xué)習(xí)代碼中更改的概率分布,該方法包括兩個(gè)模型,使用的都為L(zhǎng)STM。如圖3 所示,實(shí)現(xiàn)這一工具同樣為三個(gè)階段:補(bǔ)丁預(yù)處理、模型訓(xùn)練、模型測(cè)試階段。
圖3 CODⅠT方法框架Fig.3 Framework of CODⅠT
DLFix[17]是用于程序自動(dòng)修復(fù)的基于上下文的代碼轉(zhuǎn)換學(xué)習(xí)方法,使用的是雙層基于樹(shù)的深度學(xué)習(xí)模型,該深度學(xué)習(xí)模型同樣為L(zhǎng)STM。工具實(shí)現(xiàn)主要分為四個(gè)階段:預(yù)處理、模型訓(xùn)練、程序分析過(guò)濾和補(bǔ)丁重排序階段。如圖4為DLFix的方法框架。
圖4 DLFix方法框架Fig.4 Framework of DLFix
CoCoNuT[18]結(jié)合上下文感知的神經(jīng)機(jī)器翻譯模型并使用集成學(xué)習(xí)來(lái)進(jìn)行跨多語(yǔ)言的自動(dòng)修復(fù),主要使用的神經(jīng)網(wǎng)絡(luò)模型為卷積神經(jīng)網(wǎng)絡(luò),這是卷積神經(jīng)網(wǎng)絡(luò)在程序自動(dòng)修復(fù)中的首次應(yīng)用。如圖5所示,這一技術(shù)同樣包括三個(gè)階段:訓(xùn)練、推理和驗(yàn)證階段。
圖5 CoCoNuT方法框架Fig.5 Framework of CoCoNuT
缺陷分類(lèi)有很多種方法,根據(jù)不同的分類(lèi)目的,缺陷分類(lèi)的過(guò)程、復(fù)雜度和應(yīng)用領(lǐng)域也不同。在程序修復(fù)領(lǐng)域,Pan 等人[19]提出了針對(duì)Java 程序中的缺陷分類(lèi)方法,并將缺陷根據(jù)語(yǔ)句特征分為9 大類(lèi)。參照Pan 等人[19]及Liu 等人[20]提出修復(fù)模式,總結(jié)了10 個(gè)缺陷修復(fù)模式,并對(duì)缺陷庫(kù)Defects4J中缺陷進(jìn)行分類(lèi)。
通過(guò)對(duì)Defects4J 中的補(bǔ)丁進(jìn)行分析,總結(jié)了基于代碼更改操作的10 個(gè)基本的缺陷類(lèi)型,每個(gè)類(lèi)型下會(huì)有不同的子類(lèi)型。
(1)ⅠF語(yǔ)句:這一類(lèi)是與ⅠF語(yǔ)句相關(guān)的缺陷,包括增加/刪除ⅠF謂詞、增加/刪除ⅠF主體、增加/刪除else語(yǔ)句、ⅠF條件表達(dá)式的更改,以及ⅠF語(yǔ)句與其他語(yǔ)句的替換。
(2)方法語(yǔ)句:這一類(lèi)是與方法語(yǔ)句相關(guān)的缺陷。包括增加/刪除/更改方法聲明、增加/刪除方法調(diào)用、更改調(diào)用方法、更改參數(shù)值或參數(shù)數(shù)量、其他語(yǔ)句與方法調(diào)用的替換。
(3)循環(huán)語(yǔ)句:這一類(lèi)是與循環(huán)語(yǔ)句相關(guān)的缺陷。包括增加/刪除循環(huán)、循環(huán)條件更改以及其他語(yǔ)句與循環(huán)體之間的替換。
(4)賦值語(yǔ)句:這一類(lèi)是與賦值語(yǔ)句相關(guān)的缺陷。包括增加/刪除賦值語(yǔ)句以及賦值表達(dá)式的更改。
(5)switch:這一類(lèi)是與switch語(yǔ)句相關(guān)的缺陷。主要包括增加/刪除case分支/switch條件的更改。
(6)try/catch:這一類(lèi)是與try/catch 語(yǔ)句相關(guān)的缺陷。包括添加/刪除try語(yǔ)句或catch語(yǔ)句塊。
(7)return:這里的return 指代是return/break/continue/throw(拋出異常)語(yǔ)句,這類(lèi)缺陷是指與它們相關(guān)的缺陷。包括增加/刪除這些語(yǔ)句、return 表達(dá)式的更改,以及這些語(yǔ)句之間的替換。
(8)類(lèi)字段:這一類(lèi)是與類(lèi)字段相關(guān)的缺陷。包括類(lèi)字段聲明更改、執(zhí)行多個(gè)類(lèi)實(shí)例創(chuàng)建。
(9)移動(dòng)語(yǔ)句:這一類(lèi)主要是指需要改變語(yǔ)句所在位置的缺陷。
(10)其他:這一類(lèi)缺陷的修復(fù)包括類(lèi)型更改、運(yùn)算符更改、變量更改、整數(shù)除法更改。這些類(lèi)型排除之前提到過(guò)的相關(guān)類(lèi)型。
由于目前Defects4J 是軟件自動(dòng)修復(fù)工具最常使用的基準(zhǔn)集,且進(jìn)行比較的幾種基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)工具都可在Defects4J 上進(jìn)行評(píng)估,Defects4J 缺陷庫(kù)中的缺陷類(lèi)型包括6 個(gè)項(xiàng)目,如表2 所示。這里使用的是Defects4J-v1.1.0
表2 Defects4J 的組成Table 2 Composition of Defects4J
在使用Defects4J數(shù)據(jù)集時(shí),需要根據(jù)不同的模型對(duì)數(shù)據(jù)集進(jìn)行不同的預(yù)處理。比如,在使用工具SequenceR時(shí),由于SequenceR 專(zhuān)注于修復(fù)單行缺陷代碼,所以需要排除掉Defects4J中的非單行缺陷;在使用CODⅠT時(shí),則需要從Defects4J的6個(gè)項(xiàng)目中創(chuàng)建一個(gè)代碼更改集。
Defects4J中全部缺陷類(lèi)型組成,如表3所示。
表3 Defects4J中缺陷的類(lèi)型Table 3 Types of defects in Defects4J
Defects4J中與ⅠF語(yǔ)句相關(guān)的缺陷多達(dá)230個(gè),占所有缺陷的58.5%,其中類(lèi)型為“增加ⅠF主體的缺陷”數(shù)量最多,有120個(gè),占ⅠF語(yǔ)句缺陷類(lèi)型的51.9%,其次有80個(gè)缺陷為“ⅠF條件表達(dá)式更改”類(lèi)型,占ⅠF語(yǔ)句缺陷類(lèi)型的34.6%;方法語(yǔ)句類(lèi)型:Defects4J 中與其相關(guān)的缺陷有92 個(gè),是全部缺陷的23.3%,是除ⅠF 語(yǔ)句類(lèi)型外最多的缺陷類(lèi)型,而其中“更改方法調(diào)用參數(shù)”類(lèi)型的缺陷數(shù)量最多;除此之外,Defects4J 中與return 語(yǔ)句類(lèi)型相關(guān)的缺陷數(shù)量最多,共50個(gè),占Defects4J中缺陷的12.7%;最少的是try/catch類(lèi)型。要注意的是,由于Defects4J中的缺陷一般包含多個(gè)錯(cuò)誤行,因此一個(gè)缺陷可能和多種缺陷類(lèi)型相關(guān),在表3 中,將Defects4J 中的缺陷歸到某一類(lèi)時(shí),主要是指該缺陷包含該缺陷類(lèi)型的錯(cuò)誤行,所以每種缺陷類(lèi)型的缺陷數(shù)量之和會(huì)超過(guò)Defects4J中的缺陷數(shù)量395,因?yàn)橥粋€(gè)缺陷可能會(huì)與多種缺陷類(lèi)型相關(guān)。
該實(shí)證研究的目的是研究基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法對(duì)不同類(lèi)型缺陷的修復(fù)偏好。為此,首先分析基于深度學(xué)習(xí)模型的軟件自動(dòng)修復(fù)方法整體上對(duì)不同類(lèi)型缺陷的修復(fù)概率,然后比較不同學(xué)習(xí)模型對(duì)不同類(lèi)型缺陷的修復(fù)偏好,并比較分析每種方法各自更傾向于修復(fù)哪一類(lèi)型的缺陷。
本文實(shí)驗(yàn)的運(yùn)行環(huán)境為64 位Windows 與Linux 系統(tǒng),編譯環(huán)境為Python3。
表4展示了5種修復(fù)工具通過(guò)實(shí)驗(yàn)修復(fù)的不同類(lèi)型缺陷的總的修復(fù)概率。由第三列可以看出,5種修復(fù)工具修復(fù)的缺陷類(lèi)型涉及了除try/catch語(yǔ)句之外的9種基本類(lèi)型,修復(fù)的缺陷數(shù)量最多的3種缺陷類(lèi)型依次為ⅠF語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型以及return語(yǔ)句類(lèi)型,然后是賦值語(yǔ)句與類(lèi)字段類(lèi)型的缺陷。而try/catch 語(yǔ)句類(lèi)型的缺陷沒(méi)有得到修復(fù)的原因,可能是Defects4J 中這一類(lèi)型的缺陷量最少,總共只有5個(gè)。
表4 所有修復(fù)缺陷的缺陷類(lèi)型Table 4 Types of all repaired defects
表4所示的修復(fù)概率可以看出,其他類(lèi)型的缺陷修復(fù)概率最高,其次是方法語(yǔ)句類(lèi)型的缺陷,然后是return語(yǔ)句類(lèi)型,賦值語(yǔ)句與類(lèi)字段類(lèi)型的修復(fù)概率相當(dāng),其后才是ⅠF語(yǔ)句類(lèi)型的缺陷??梢钥闯觯迯?fù)概率與修復(fù)缺陷數(shù)量并不是成正比的關(guān)系,基于下面的原因。
首先,其他類(lèi)型的缺陷基本上只包含運(yùn)算符更改、類(lèi)型更改等簡(jiǎn)單易修復(fù)的缺陷,而且數(shù)據(jù)集中這一類(lèi)缺陷數(shù)量較少,因此盡管結(jié)果顯示這一類(lèi)缺陷修復(fù)概率較高,但這只是表明修復(fù)方法傾向于修復(fù)復(fù)雜程度低的缺陷,而方法語(yǔ)句與return語(yǔ)句類(lèi)型的修復(fù)概率較高,與之對(duì)應(yīng)的修復(fù)缺陷數(shù)量也較高,可以得出基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法對(duì)這兩種缺陷的修復(fù)偏好是較高的;對(duì)于賦值語(yǔ)句與類(lèi)字段類(lèi)型來(lái)說(shuō),由于類(lèi)字段類(lèi)型當(dāng)中包括類(lèi)字段的聲明與賦值,所以這兩種在很大程度上可以看作是賦值語(yǔ)句類(lèi)型,因此兩者的修復(fù)數(shù)量與概率都相差不大;對(duì)于ⅠF語(yǔ)句,從缺陷分類(lèi)的結(jié)果可以看到,數(shù)據(jù)集中與這一類(lèi)型相關(guān)的缺陷數(shù)量最多,而復(fù)雜程度較高的缺陷基本都與這一類(lèi)型相關(guān),復(fù)雜程度越高越難以修復(fù),因此這一類(lèi)型相關(guān)的缺陷修復(fù)概率與前面幾種相比顯得不高。
因此,經(jīng)過(guò)綜合分析后可以得知:對(duì)于修復(fù)的缺陷數(shù)量來(lái)說(shuō),基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法修復(fù)最多的是ⅠF 語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型、return 語(yǔ)句類(lèi)型的缺陷,但是對(duì)于缺陷修復(fù)的概率來(lái)說(shuō),由于受到缺陷復(fù)雜程度的影響,基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法對(duì)ⅠF語(yǔ)句的修復(fù)概率較低,其他類(lèi)型的缺陷修復(fù)概率較高,同時(shí)修復(fù)方法語(yǔ)句類(lèi)型、return語(yǔ)句類(lèi)型、賦值語(yǔ)句與類(lèi)字段類(lèi)型缺陷的概率也較高。
表5 展示了基于不同深度學(xué)習(xí)模型的軟件修復(fù)工具在Defects4J上修復(fù)的不同類(lèi)型的缺陷數(shù)量。第一列為缺陷類(lèi)型,第二至六列是5種缺陷修復(fù)工具的修復(fù)缺陷數(shù)量;最后一行的缺陷總數(shù)總是小于等于10 種缺陷類(lèi)型的修復(fù)缺陷數(shù)量之和,因?yàn)榇嬖谕蝗毕菖c多種缺陷類(lèi)型相關(guān)的情況。
表5 各修復(fù)工具修復(fù)缺陷的缺陷類(lèi)型組成Table 5 Types composition of defects repaired by each repair tool
如果僅從表4的占比來(lái)看,每一種類(lèi)型缺陷的修復(fù)偏好相差不大,其根本原因在于現(xiàn)有的缺陷自動(dòng)修復(fù)方法修復(fù)能力不足。例如,表5 中所示的修復(fù)Defect4J 數(shù)據(jù)集缺陷最多的DeepRepair 方法,僅僅修復(fù)了51 個(gè)缺陷,占總?cè)毕輸?shù)的12.9%(51/395),使得每一種類(lèi)的修復(fù)占比都比較低,差距小。在此背景下,DeepRepair 修復(fù)24個(gè)ⅠF語(yǔ)句類(lèi)型缺陷,10個(gè)方法語(yǔ)句缺陷,前者是后者的2.4倍,由此可以看出修復(fù)偏好相差較大。
整體來(lái)看,除了CODⅠT之外,其他每種修復(fù)工具與3.1節(jié)的結(jié)論相符,修復(fù)最多的缺陷為ⅠF語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型以及return 語(yǔ)句類(lèi)型的缺陷;對(duì)于CODⅠT,除了方法語(yǔ)句類(lèi)型以及return語(yǔ)句類(lèi)型的缺陷,修復(fù)的類(lèi)字段類(lèi)型的缺陷比ⅠF語(yǔ)句類(lèi)型的缺陷更多。從最后一行可以看到,基于自編碼器且在多粒度上運(yùn)行的Deep-Repair 修復(fù)的缺陷最多,與其他的修復(fù)工具相比,它修復(fù)的ⅠF語(yǔ)句類(lèi)型、循環(huán)語(yǔ)句類(lèi)型、賦值語(yǔ)句類(lèi)型以及類(lèi)字段類(lèi)型相關(guān)的缺陷數(shù)量明顯高于其他工具,原因是DeepRepair使用了多個(gè)修復(fù)策略,并在多個(gè)粒度上尋找補(bǔ)丁。由此可知,修復(fù)策略、工作粒度對(duì)學(xué)習(xí)模型的修復(fù)效果具有極大的促進(jìn)作用;而SequenceR修復(fù)的缺陷數(shù)最少,因?yàn)樗会槍?duì)單行缺陷。下面詳細(xì)分析比較幾種修復(fù)方法的修復(fù)結(jié)果。
(1)基于LSTM、AE以及CNNs模型修復(fù)工具的修復(fù)結(jié)果分析
由于SequenceR、CODⅠT 與DLFix 使用基本的深度學(xué)習(xí)模型都為基于LSTM的編碼器-解碼器的神經(jīng)機(jī)器翻譯模型,可將三者的修復(fù)結(jié)果合為一體以LSTM 表示,與其他兩種工具的修復(fù)結(jié)果進(jìn)行比較;AE指的是基于自編碼器的DeepRepair 的結(jié)果;CNNs 指的是基于CNNs的CoCoNuT的結(jié)果。
如圖6通過(guò)韋恩圖表示了3種學(xué)習(xí)模型所修復(fù)缺陷的重疊的情況,重點(diǎn)關(guān)注修復(fù)結(jié)果的不同之處,并結(jié)合表5分析圖6中非重疊的部分的缺陷。
圖6 3種不同學(xué)習(xí)模型修復(fù)缺陷的重疊情況Fig.6 Overlapping of repaired defects of three different learning models
首先,對(duì)于DeepRepair,非重疊部分的27個(gè)缺陷,其中有48.1%的缺陷與ⅠF語(yǔ)句類(lèi)型相關(guān),這表明與其他模型相比,它更擅長(zhǎng)于修復(fù)ⅠF 語(yǔ)句類(lèi)型的缺陷,這與表5中的結(jié)果一致;同時(shí),DeepRepair 修復(fù)的缺陷種類(lèi)數(shù)是最多的,只有它修復(fù)了一個(gè)移動(dòng)語(yǔ)句類(lèi)型的缺陷,而且它修復(fù)缺陷中的賦值語(yǔ)句類(lèi)型的缺陷占比明顯高于其他兩種基本學(xué)習(xí)模型。這表明基于自編碼器且擁有多種修復(fù)策略與工作粒度的軟件自動(dòng)修復(fù)方法在修復(fù)的缺陷數(shù)量和缺陷類(lèi)型數(shù)量上具有一定優(yōu)勢(shì)。
其次,對(duì)使用基于LSTM 的編碼器-解碼器的神經(jīng)機(jī)器翻譯模型的修復(fù)方法來(lái)說(shuō),與其他兩種模型相比,它們修復(fù)的26個(gè)缺陷中與方法語(yǔ)句類(lèi)型相關(guān)的缺陷數(shù)最多,占比達(dá)到61.5%,這表明本文用于比較的3種基于LSTM 的修復(fù)方法整體上更傾向于修復(fù)方法語(yǔ)句類(lèi)型的缺陷,這同樣與表5中的結(jié)果一致;同時(shí),只有它獨(dú)自修復(fù)的缺陷中包含switch類(lèi)型的語(yǔ)句。
最后,對(duì)于基于CNNs 的修復(fù)工具CoCoNuT 來(lái)說(shuō),不僅是從非重疊部分的11個(gè)缺陷的分析,還是從表5的分析中都可以發(fā)現(xiàn),它的修復(fù)結(jié)果中,與ⅠF語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型以及return語(yǔ)句類(lèi)型相關(guān)的缺陷數(shù)量相差不大,這表明它對(duì)這3 種類(lèi)型缺陷的修復(fù)偏好相差不大。而從缺陷的復(fù)雜程度來(lái)看,DeepRepair 與CoCoNuT 能修復(fù)更高復(fù)雜程度的缺陷。
(2)SequenceR與CODⅠT的修復(fù)結(jié)果分析
對(duì)于同樣使用LSTM模型的兩種修復(fù)方法SequenceR與CODⅠT來(lái)說(shuō),SequenceR是序列到序列的神經(jīng)機(jī)器翻譯模型,CODⅠT 是基于樹(shù)的序列到序列的神經(jīng)機(jī)器翻譯模型,如圖7是SequenceR與CODⅠT的修復(fù)結(jié)果的重疊情況。
圖7 SequenceR與CODⅠT修復(fù)缺陷的重疊情況Fig.7 Overlapping of repaired defects of SequenceR and CODⅠT
其中SequenceR 單獨(dú)修復(fù)13 個(gè)缺陷,而CODⅠT 單獨(dú)修復(fù)20個(gè)缺陷。在非重疊部分,SequenceR修復(fù)更多的是與ⅠF 語(yǔ)句類(lèi)型相關(guān)的缺陷,而CODⅠT 修復(fù)更多的是與方法語(yǔ)句類(lèi)型相關(guān)的缺陷。造成這一結(jié)果的原因是SequenceR 是序列到序列的模型,針對(duì)的是代碼行,而CODⅠT和DLFix都是方法粒度的。這說(shuō)明工作粒度在很大程度上影響了修復(fù)的缺陷類(lèi)型。
(3)CODⅠT與DLFix的修復(fù)結(jié)果分析
對(duì)于使用LSTM 模型的兩種修復(fù)方法CODⅠT 與DLFix來(lái)說(shuō),CODⅠT是基于樹(shù)的序列到序列的神經(jīng)機(jī)器翻譯模型,而DLFix則是雙層基于樹(shù)的代碼轉(zhuǎn)換的神經(jīng)機(jī)器翻譯模型,如圖8是CODⅠT與DLFix的修復(fù)結(jié)果的重疊情況,CODⅠT單獨(dú)修復(fù)缺陷17個(gè),而DLFix單獨(dú)修復(fù)缺陷32個(gè)。對(duì)圖8的非重疊部分的缺陷進(jìn)行分析,并結(jié)合表5可以看到,使用DLFix比CODⅠT能夠修復(fù)更多缺陷;同時(shí),從表5中可以看到,CODⅠT主要修復(fù)方法語(yǔ)句類(lèi)型缺陷而較大程度上忽略ⅠF 語(yǔ)句類(lèi)型的缺陷,而DLFix則彌補(bǔ)了這一缺陷,它對(duì)這兩種類(lèi)型缺陷的修復(fù)偏好相差不大。
圖8 CODⅠT與DLFix修復(fù)缺陷的重疊情況Fig.8 Overlapping of repaired defects of CODⅠT and DLFix
可從內(nèi)部有效性和外部有效性兩個(gè)方面來(lái)分析可能影響到本文實(shí)證研究結(jié)論有效性的影響因素。
影響內(nèi)部有效性的因素主要來(lái)自兩個(gè)方面,一個(gè)是缺陷分類(lèi)的標(biāo)準(zhǔn),另一個(gè)是用于比較的修復(fù)方法。對(duì)于缺陷分類(lèi),本文參考了多篇文獻(xiàn),根據(jù)修復(fù)模式逐個(gè)對(duì)缺陷進(jìn)行了分類(lèi),保證了分類(lèi)的準(zhǔn)確性;對(duì)于修復(fù)方法,本文主要比較的是文中選取的五種修復(fù)方法的結(jié)果,而其他修復(fù)方法的結(jié)果如何有待進(jìn)一步研究。而且在研究不同模型對(duì)缺陷類(lèi)型的修復(fù)偏好時(shí),其他因素(如工作粒度等)的影響較大,之后的工作可以進(jìn)行探討。
而影響外部有效性的因素主要來(lái)源于缺陷庫(kù)。Defects4J中部分項(xiàng)目的缺陷數(shù)量較少,因此在分析不同項(xiàng)目?jī)?nèi)的缺陷時(shí)對(duì)結(jié)果的影響較大,但是本文主要是針對(duì)整體缺陷進(jìn)行研究,因此很大程度上可以避免這一影響;而Defect4J 數(shù)據(jù)集不涉及深度學(xué)習(xí)模型的訓(xùn)練,只是對(duì)訓(xùn)練后的深度學(xué)習(xí)模型進(jìn)行評(píng)估。本文之所以選取Defect4J進(jìn)行分析,是因?yàn)楸疚闹兴械姆椒ㄔ谠u(píng)估時(shí)都用到了該數(shù)據(jù)集。同時(shí),Defect4J數(shù)據(jù)集是一個(gè)被廣泛使用的缺陷基準(zhǔn)數(shù)據(jù)集,涉及的缺陷類(lèi)型全面,適合進(jìn)行缺陷修復(fù)偏好研究。為了進(jìn)一步減少數(shù)據(jù)集方面存在的有效性威脅,在未來(lái)的工作中,將進(jìn)行更全面的實(shí)驗(yàn),從而分析本文中的這些方法在更多缺陷基準(zhǔn)中的修復(fù)偏好性。
本文根據(jù)缺陷修復(fù)模式對(duì)Defects4J 中的缺陷進(jìn)行分類(lèi),通過(guò)實(shí)驗(yàn)給出了5種基于不同學(xué)習(xí)模型的修復(fù)工具 在Defects4J 上整體的修復(fù)概率,同時(shí)分析這5 種修復(fù)工具各自在Defects4J 上的修復(fù)結(jié)果,并對(duì)各類(lèi)缺陷的修復(fù)偏好進(jìn)行比較分析。實(shí)驗(yàn)結(jié)果表明,基于深度學(xué)習(xí)的軟件自動(dòng)修復(fù)方法傾向于修復(fù)ⅠF語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型、return 語(yǔ)句類(lèi)型的缺陷?;谧跃幋a器的軟件自動(dòng)修復(fù)方法DeepRepair 更傾向于修復(fù)ⅠF 語(yǔ)句類(lèi)型的缺陷,選取的基于LSTM 的編碼器-解碼器的修復(fù)方法整體上更傾向于修復(fù)與方法語(yǔ)句類(lèi)型相關(guān)的缺陷,而基于CNNs 編碼器-解碼器的修復(fù)方法則對(duì)ⅠF 語(yǔ)句類(lèi)型、方法語(yǔ)句類(lèi)型以及return語(yǔ)句類(lèi)型這3種類(lèi)型缺陷的修復(fù)偏好相差不大。