亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于變異和約束求解的程序缺陷自動(dòng)修復(fù)方法

        2024-01-22 07:18:56蘭,洪玫,伍
        關(guān)鍵詞:測試用例補(bǔ)丁表達(dá)式

        董 蘭,洪 玫,伍 佳

        (四川大學(xué) 計(jì)算機(jī)學(xué)院(軟件學(xué)院),四川 成都 610065)

        0 引 言

        目前軟件缺陷自動(dòng)修復(fù)技術(shù)[1]主要有基于啟發(fā)式搜索、語義約束、人工修復(fù)模板、統(tǒng)計(jì)分析等方法,其中大部分方法都通用的,缺陷修復(fù)的召回率和準(zhǔn)確率不高[2]。對(duì)于基于人工修復(fù)模板的方法具有針對(duì)性,只能針對(duì)常見、特征明確的缺陷類型。而基于測試的缺陷修復(fù)方法則依賴于通過的測試數(shù)據(jù),而在Defects4 J庫中有95%以上的程序缺陷在被修復(fù)之前沒有相應(yīng)的未通過測試,而測試覆蓋率與補(bǔ)丁質(zhì)量成正相關(guān),挖掘到的程序規(guī)約信息有限,約束求解效果不好[2]。

        本文針對(duì)Java程序中出現(xiàn)頻率較高的條件語句的相關(guān)缺陷修復(fù)問題,將啟發(fā)式搜索方法與語義約束求解方法相結(jié)合,提出一個(gè)更高效的解決方案。針對(duì)條件語句缺失錯(cuò)誤,基于約束求解,通過收集程序語義信息,采用基于組件的程序合成技術(shù),生成候選條件表達(dá)式。同時(shí),針對(duì)條件語句邏輯表達(dá)式錯(cuò)誤,首先采用變異技術(shù),生成候選補(bǔ)丁;其次,對(duì)于條件語句邏輯表達(dá)式錯(cuò)誤中不能利用變異技術(shù)修復(fù)的缺陷,再使用約束求解方法生成補(bǔ)丁。最后驗(yàn)證補(bǔ)丁的有效性。該方案解決了Java程序自動(dòng)修復(fù)中的重要問題,并在修復(fù)效率上有所提高,值得借鑒和參考。

        1 相關(guān)工作

        在自動(dòng)軟件缺陷修復(fù)技術(shù)中,常用的修復(fù)方法是基于啟發(fā)式搜索的技術(shù),該方法通過改變?cè)既毕莩绦蛏尚鲁绦蜃鳛楹蜻x補(bǔ)丁。代表性研究有GenProg、RSRepair、Kail等方法。GenProg[3]采用抽象語法樹、遺傳算法,運(yùn)用交叉、變異算子等生成程序候選補(bǔ)丁。RSRepair[4]選擇隨機(jī)搜索來指導(dǎo)生成-驗(yàn)證過程,而Kail[5]是一種試圖通過刪除潛在的不必要但有害的功能來修復(fù)程序的技術(shù)。

        基于語義約束的缺陷修復(fù)方法,其綜合應(yīng)用缺陷定位、天使調(diào)試、約束求解、程序合成等多種技術(shù)[6]來修復(fù)補(bǔ)丁,代表性研究有SemFix、Angelix和Nopol等方法。SemFix[7-9]綜合使用天使調(diào)試和基于組件的程序合成算法,約束求解器求解獲得程序補(bǔ)丁。Angelix[10]旨在保持可伸縮性的同時(shí)綜合多行修復(fù)。而Nopol[11,12]合成了在條件或循環(huán)語句中發(fā)生的一條更改條件組成的修復(fù),利用天使修復(fù)定位獲得天使值,通過合成條件表達(dá)式修復(fù)缺陷。

        針對(duì)Java程序缺陷的修復(fù)方法,除了Nopol方法之外,還有針對(duì)修復(fù)Java語言的內(nèi)存溢出、資源泄露、空指針引用、內(nèi)存溢出等缺陷的FootPatch方法[13],以及高精度的條件語句綜合技ACS[14],針對(duì)空指針、數(shù)據(jù)越界以及類型強(qiáng)轉(zhuǎn)缺陷的Genesis自動(dòng)修復(fù)技術(shù)[15]。

        由于單一的自動(dòng)缺陷修復(fù)方法不能保證任何類型的缺陷都可以成功修復(fù)[16],因此,針對(duì)特定缺陷類型,考慮綜合的自動(dòng)化修復(fù)方法就有一定的研究價(jià)值。本文針對(duì)Java程序中條件語句邏輯錯(cuò)誤和條件語句缺失錯(cuò)誤兩類缺陷,借鑒啟發(fā)式搜索中的變異方法和語義驅(qū)動(dòng)的約束求解、組件合成等方法,并對(duì)這些方法進(jìn)行綜合運(yùn)用,以提高缺陷修復(fù)率和補(bǔ)丁精度。

        2 問題描述和基本思路

        研究者通過挖掘和分析7個(gè)大型開源Java項(xiàng)目的歷史缺陷修復(fù)記錄,總結(jié)了9大類、27個(gè)缺陷修復(fù)模式。其中,最常見的是IF條件相關(guān)(IF),占19.7%~33.9%[17]。而IF-CC和 IF-APC所對(duì)應(yīng)的條件語句錯(cuò)誤和條件語句缺失兩類缺陷在實(shí)際缺陷中占據(jù)較大比例,見表1。

        表1 Java程序中的缺陷修復(fù)模式

        因此針對(duì)Java程序中的條件語句邏輯錯(cuò)誤和條件語句缺失錯(cuò)誤的常見缺陷,探索缺陷自動(dòng)修復(fù)方法。條件語句邏輯表達(dá)式錯(cuò)誤是指條件表達(dá)式存在邏輯錯(cuò)誤,導(dǎo)致程序無法執(zhí)行到期望的分支;條件語句缺失錯(cuò)誤是指在執(zhí)行某些操作之前,缺少前置條件的檢查,比如檢測空指針。

        針對(duì)上述兩類條件語句相關(guān)的缺陷,本文采用收集測試信息(G1),使用本文提出的方法生成滿足的候選補(bǔ)丁(G2),最后通過測試套件驗(yàn)證候選補(bǔ)丁(G3)這3個(gè)階段過程,實(shí)現(xiàn)缺陷的自動(dòng)修復(fù)。首先通過執(zhí)行相關(guān)的測試用例,收集程序執(zhí)行時(shí)待修復(fù)程序位置處可訪問的數(shù)據(jù)變量和對(duì)應(yīng)的值,形成待求解的修復(fù)方程式;其次,確定可修復(fù)程序位置的語句類型以采用不同的補(bǔ)丁生成方案進(jìn)行缺陷修復(fù)。如果待修復(fù)位置是條件語句表達(dá)式缺陷,先采用變異技術(shù)產(chǎn)生候選補(bǔ)丁,如果沒有相符合的補(bǔ)丁,再使用基于約束求解方法,合成條件表達(dá)式;如果是條件語句缺失缺陷,直接應(yīng)用基于約束求解方法生成表達(dá)式,并將生成的表達(dá)式作為前置條件添加在源程序中。最后,運(yùn)行測試用例,再次進(jìn)行補(bǔ)丁驗(yàn)證。整體方案流程如圖1所示。

        圖1 方案流程

        3 基于測試數(shù)據(jù)形成缺陷修復(fù)方程式

        根據(jù)測試用例的執(zhí)行,收集與待修復(fù)缺陷相關(guān)的測試用例執(zhí)行過程中的上下文信息。

        3.1 條件表達(dá)式實(shí)際輸入數(shù)據(jù)收集

        在程序執(zhí)行過程中,收集執(zhí)行到待修復(fù)條件語句exp-patch之前所有可訪問的變量以及變量值,包括基本類型數(shù)據(jù)和面對(duì)對(duì)象程序的特定數(shù)據(jù),主要包括局部變量、成員變量、方法參數(shù)以及它們對(duì)應(yīng)的值。將收集到的數(shù)據(jù)稱為輸入數(shù)據(jù),用Il,m,n,其中,l表示待修復(fù)條件表達(dá)式exp-patch所在位置,n和m分別表示第n個(gè)測試用例的第m次執(zhí)行。除此之外,還增加3個(gè)基準(zhǔn)常數(shù){-1,0,1}來豐富Il,m,n, 其它的數(shù)據(jù)都可以基于這3個(gè)基準(zhǔn)常數(shù)構(gòu)建。假設(shè)l位置在可修復(fù)的程序位置范圍內(nèi)有a個(gè)基本變量和一組對(duì)象集合O(共O個(gè)對(duì)象),則Il,m,n包含的數(shù)據(jù)如下:

        a個(gè)基本變量以及變量對(duì)應(yīng)的變量值。如:a→10;

        w個(gè)boolean值,分別表示O個(gè)對(duì)象是否為空。如:obj1=null→false;

        object中對(duì)象各自對(duì)應(yīng)類的狀態(tài)查詢方法及其輸出,如obj2.size()→5;

        常數(shù),如0,1,-1。

        3.2 條件表達(dá)式期望輸出結(jié)果收集

        當(dāng)執(zhí)行完待修復(fù)的條件表達(dá)式exp-patch時(shí),能使所有測試用例能執(zhí)行通過的值稱為條件表達(dá)式的期望輸出。取值范圍為{true,false},用Ol,m,n來表示期望輸出。如果l位置為條件語句,對(duì)于測試用例執(zhí)行是失敗的,天使值即為exp-patch期望輸出,天使值(angelicValue)指可以讓失敗的測試用例執(zhí)行成功的值,取值范圍為{true,false};如果是成功的測試用例,條件表達(dá)式exp-patch的實(shí)際輸出即為期望輸出。如果l位置為非條件語句,針對(duì)失敗的測試用例,Ol,m,n其對(duì)應(yīng)值均為false,對(duì)于成功的測試用例,Ol,m,n均為true。

        3.3 缺陷修復(fù)方程式形成

        根據(jù)上述實(shí)際輸入的數(shù)據(jù)Il,m,n和期望的輸出結(jié)果Ol,m,n, 可以形成式(1)的待求解的修復(fù)方程式F,定義為

        (1)

        所有的 都包含了表達(dá)式exp-patch應(yīng)該滿足的程序語義約束,可以使用約束求解器對(duì)該約束進(jìn)行求解,合成候選補(bǔ)丁。

        4 基于變異分析技術(shù)的程序候選補(bǔ)丁生成

        變異分析一般用于檢測測試套件對(duì)程序缺陷的發(fā)現(xiàn)能力[18],其思路主要是對(duì)原程序P中引入小的代碼修改,形成缺陷的變體P′, 然后運(yùn)行測試套件TS,觀察測試套件在原程序P和程序變體P′中的執(zhí)行情況,查看測試套件是否能夠檢測到引入的缺陷。其中,引起代碼修改的操作被定義為變異算子。

        基于文獻(xiàn)的研究[19],對(duì)于條件語句缺陷自動(dòng)修復(fù),將變異技術(shù)應(yīng)用其中。如果待修復(fù)的表達(dá)式exp-patch為if條件語句時(shí),使用預(yù)先設(shè)計(jì)的變異算子,在該條件表達(dá)式中植入小的代碼變更,產(chǎn)生所有可能的一階程序變體P′bug, 作為候選補(bǔ)丁。本文依據(jù)修復(fù)錯(cuò)誤的條件三要素:條件子句、變量和操作符,設(shè)計(jì)了如下變異算子。

        變異算子1:否定條件表達(dá)式,如if(a>0‖b<0) 變異成if(!a>0‖b<0);

        變異算子2:替換同類運(yùn)算符,包括運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符,如if(a>0‖b<0) 變異成if(a>0‖b>0);

        變異算子3:移除條件表達(dá)式中的一個(gè)條件子句,如if(a<0‖b<0) 變異成if(a<0);

        在應(yīng)用變異算子3時(shí),還可以考慮失敗的測試用例所對(duì)應(yīng)的天使值,如果所有失敗測試用例的天使值都為true,則表示失敗測試用例執(zhí)行完條件表達(dá)式的輸出應(yīng)該由false轉(zhuǎn)變?yōu)閠rue;如果都為false,則表示失敗測試用例執(zhí)行完條件表達(dá)式的輸出應(yīng)該由true轉(zhuǎn)變?yōu)閒alse。通過移除一個(gè)條件子句來收縮、擴(kuò)張條件表達(dá)式的判定范圍,具體的移除方式為:收縮判定范圍:if(clause‖clause1)>=if(clause)。 擴(kuò)張判定范圍:if(clause&&clause1)>=if(clause)。

        本文只使用Pbug的一階變體作為候選補(bǔ)丁,比如,對(duì)條件表達(dá)式if(x>0‖y<0) 進(jìn)行變異,所有可能的候選補(bǔ)丁見表2。

        表2 基于變異算子生成補(bǔ)丁

        由于利用變異技術(shù)產(chǎn)生條件表達(dá)式的候選補(bǔ)丁時(shí),可能會(huì)生成大量無效的程序變體。為了避免這種情況,此時(shí),3.3節(jié)得到的修復(fù)方程式可用于初步篩選變異生成的程序變體,使?jié)M足程序語義約束的變體作為候選補(bǔ)丁,以減少待驗(yàn)證補(bǔ)丁的數(shù)量。

        5 基于約束求解的程序補(bǔ)丁合成方法

        對(duì)于上述候選補(bǔ)丁不能修復(fù)缺陷的情況,作為補(bǔ)充本文還提供一種語義驅(qū)動(dòng)的補(bǔ)丁生成方法。利用自動(dòng)化程序合成技術(shù),將補(bǔ)丁生成問題轉(zhuǎn)化為約束求解的問題,將求得解轉(zhuǎn)化為程序補(bǔ)丁。通過運(yùn)行測試用例,獲取一系列的<輸入,期望輸出>對(duì),作為I/O的Oracle;定義一組用于合成程序的基礎(chǔ)組件,如操作符、常數(shù)值、函數(shù)方法等;合成過程以一系列<輸入,期望輸出>對(duì)和基礎(chǔ)組件作為輸入,輸出一段滿足所有<輸入,期望輸出>對(duì)的程序[9]。

        假設(shè)待修復(fù)的條件表達(dá)式exp-patch的實(shí)際輸入數(shù)據(jù)包含兩個(gè)變量x和y以及常數(shù)0,獲取的I/OOracle為 <{x=1,y=2,0},true>、 <{x=2,y=1,0},false>, 可用基礎(chǔ)組件C={+、-、>、<}。 一種有效的合成過程如圖2所示,用矩形表示組件,并用位置號(hào)標(biāo)識(shí)(標(biāo)簽“l(fā)oc”),邊表示如何將在給定位置生成的值用作在另一位置的輸入(與每個(gè)位置關(guān)聯(lián)的標(biāo)簽“input”),式(1)生成約束表達(dá)式之后,SMT求解器為與每個(gè)位置關(guān)聯(lián)的變量輸入找到適當(dāng)?shù)闹怠?/p>

        圖2 基于約束求解的程序補(bǔ)丁合成示例

        假設(shè)合成條件表達(dá)式exp-patch使用一組基礎(chǔ)組件 {f1,f2,…,fn},fi表示第i個(gè)組件,Ii表示組件的輸入,ri表示組件的輸出。所有組件的輸入集合和輸出集合分別為下述I和R

        待求解條件表達(dá)式的一組實(shí)際輸入為I0(即Il,m,n), 對(duì)應(yīng)期望輸出為r(即Ol,m,n), 所有的輸入輸出集合為

        IO={I∪R∪I0{r}}

        定義位置變量

        LOC={locx|x∈IO}

        locx表示IO中的每個(gè)元素x的索引位置;取值變量

        V={vx|x∈IO}

        vx表示IO中的每個(gè)元素x的取值。對(duì)于每個(gè)測試用例的每次執(zhí)行,位置變量代表了補(bǔ)丁的組成結(jié)構(gòu),應(yīng)該保持一致。取值變量則被SMT求解器使用,用于保證合成的程序符合I/Ooracle。

        LOC應(yīng)該保證語法約束和語義約束[7]。語法約束規(guī)定了在程序語法結(jié)構(gòu)上待求解的條件表達(dá)式exp-patch應(yīng)該滿足的要求,其定義如式(2)所示

        (2)

        式中:φfixed該約束表示對(duì)于待求解條件表達(dá)式的實(shí)際輸入I0中的第i個(gè)元素,其位置變量loc的值為i; 對(duì)于待求解條件表達(dá)式的期望輸出r中的元素,其位置變量loc的值M。φoutput(R)該約束限制一個(gè)基礎(chǔ)組件fi所定義的中間變量r;其位置變量loc,應(yīng)該在 |I0|+1 到M之間。φinput(I) 表示不同的基礎(chǔ)組件能夠處理不同類型的數(shù)據(jù),該約束對(duì)每個(gè)基礎(chǔ)組件所使用的數(shù)據(jù)x的數(shù)據(jù)類型進(jìn)行限制。定義type(x) 方法可以返回與x具有相同數(shù)據(jù)類型的數(shù)據(jù),基礎(chǔ)組件的輸入數(shù)據(jù)x只能取自于這些數(shù)據(jù),即LOCx=LOCy。φcons(LOC,R) 該約束表示每個(gè)基礎(chǔ)組件所定義的變量都應(yīng)該有不同的位置變量,以便在其中使用該變量時(shí),可以索引到。φacyc(LOC,I,R) 該約束則限制了在同一個(gè)位置的元素應(yīng)該具有相同的數(shù)據(jù)值。

        除了語法約束之外,LOC還應(yīng)滿足一定的語義約束。其定義如式(3)所示

        (3)

        式中:φlib(I,R) 該約束表示任意一個(gè)基礎(chǔ)組件的輸入vIi經(jīng)過基礎(chǔ)組件所定義的計(jì)算fi后,輸出值為vri,φconn(LOC,I0,r,I,R) 該約束限制了在同一個(gè)位置的元素應(yīng)該具有相同的數(shù)據(jù)值。

        結(jié)合語法約束和語義約束,對(duì)于I/Ooracle中所有的<輸入,期望輸出>對(duì),LOC需要滿足的完整約束如式(4)所示

        (4)

        利用SMT求解器對(duì)約束θ求解,若LOC為該約束的解,則根據(jù)LOC和定義的基本組件,可以構(gòu)造出滿足程序約束的條件表達(dá)式exp-patch。

        如果可修復(fù)程序位置為if條件語句,則直接使用表達(dá)式exp-patch對(duì)原始表達(dá)式進(jìn)行替換,形成候選的程序補(bǔ)丁;如果為非if條件語句,則將表達(dá)式exp-patch作為前置條件添加,形成候選補(bǔ)丁。

        6 實(shí)驗(yàn)驗(yàn)證

        實(shí)驗(yàn)基于上述問題設(shè)計(jì)實(shí)現(xiàn)了一個(gè)條件語句缺陷自動(dòng)修復(fù)工具原型MSFix,進(jìn)行方案的可行性和有效性驗(yàn)證。

        實(shí)驗(yàn)對(duì)象選擇Defects4 J[20]數(shù)據(jù)集中的14個(gè)Java項(xiàng)目的62個(gè)條件語句缺陷,其中條件語句錯(cuò)誤缺陷41個(gè),條件語句缺失缺陷21個(gè),見表3。

        表3 實(shí)驗(yàn)對(duì)象信息

        實(shí)驗(yàn)采用召回率和準(zhǔn)確率來評(píng)價(jià)缺陷修復(fù)效果。在修復(fù)一個(gè)缺陷的過程中,如果能夠找到一個(gè)有效補(bǔ)丁能通過所有的測試,則認(rèn)為該缺陷被成功修復(fù),召回率計(jì)算方式如式(5)所示

        (5)

        在修復(fù)缺陷的過程中,如果一個(gè)有效補(bǔ)丁正確修復(fù)了缺陷,則認(rèn)為該補(bǔ)丁是正確的補(bǔ)丁,補(bǔ)丁準(zhǔn)確率計(jì)算方式如式(6)所示

        (6)

        6.1 可行性實(shí)驗(yàn)——Java程序中條件語句缺陷的修復(fù)

        通過運(yùn)行MSFix,對(duì)上述的缺陷進(jìn)行修復(fù),返回MSFix的修復(fù)結(jié)果。如果缺陷修復(fù)成功,將MSFix修復(fù)的補(bǔ)丁與Defects4 J提供的補(bǔ)丁進(jìn)行比較,驗(yàn)證補(bǔ)丁的有效性。由表4的實(shí)驗(yàn)結(jié)果可知,在上面提供的項(xiàng)目中69個(gè)條件語句缺陷來說,MSFix能夠修復(fù)39個(gè)缺陷,并且整體的召回率為62.90%。

        表4 MSFix的整體實(shí)驗(yàn)結(jié)果

        在62個(gè)條件語句缺陷中,也有23個(gè)缺陷沒有修復(fù)成功。分析其修復(fù)失敗的原因主要是:

        (1)由于本文方案輸入的可疑語句是通過可疑分?jǐn)?shù)進(jìn)行定位的,可疑語句定位時(shí)會(huì)計(jì)算可疑分?jǐn)?shù)閾值,并舍棄可疑分?jǐn)?shù)低于閾值的程序方法,只對(duì)剩余方法中的程序語句進(jìn)行分析。由于部分缺陷(如 Math-26)的測試用例不夠充足,缺少失敗測試用例對(duì)錯(cuò)誤語句的覆蓋,導(dǎo)致錯(cuò)誤語句所在的程序方法的可疑分?jǐn)?shù)較低。在進(jìn)行可疑語句定位時(shí),含有錯(cuò)誤語句的程序方法被舍棄,最終可疑語句列表中沒有真正錯(cuò)誤的語句。

        (2)由于本文方案輸入的可疑語句是通過缺陷定位得到的。在定位可修復(fù)程序位置過程中,期望每個(gè)失敗的測試用例都存在一個(gè)使其能夠執(zhí)行通過的天使值。由于部分缺陷(如Lang-16)的一個(gè)失敗測試用例中存在多個(gè)assert斷言,這些assert斷言覆蓋了if結(jié)構(gòu)的then分支和else分支。在使用true/false替換if條件表達(dá)式后,重新運(yùn)行這個(gè)失敗的測試用例,沒有辦法同時(shí)滿足多個(gè)assert斷言。因此,無法找到這個(gè)失敗測試用例的天使值,導(dǎo)致可修復(fù)程序位置定位失敗。通過以上分析可知,測試用例的質(zhì)量不高是導(dǎo)致缺陷修復(fù)失敗的重要原因。針對(duì)情況(1),可以通過額外增加失敗的測試用例來提高錯(cuò)誤語句的覆蓋率,使其能夠出現(xiàn)在可疑語句列表中,或者排名更靠前。針對(duì)情況(2),可以通過拆分失敗的測試用例,使每個(gè)測試用例中只有一個(gè)assert斷言,在可修復(fù)程序位置定位中,更可能找到使失敗測試用例都通過天使值。

        6.2 有效性實(shí)驗(yàn)——缺陷修復(fù)效果與其它方法的對(duì)比

        目前針對(duì)修復(fù)Java程序缺陷的方案中,Nopol[11,12]、jGenProg[3]和jKali[5]這3種工具比較有代表性,在比較多的相關(guān)研究中引用。因此,在方案有效性實(shí)驗(yàn)中,選擇這3種工具作為比較對(duì)象。對(duì)上述選擇的62個(gè)條件語句缺陷,分別應(yīng)用上述的3個(gè)工具和MSFix進(jìn)行自動(dòng)修復(fù),記錄并分析每個(gè)工具的修復(fù)效果,計(jì)算每個(gè)工具的缺陷召回率和準(zhǔn)確率,并進(jìn)行分析。表5展示了4種方法的整體修復(fù)結(jié)果??梢钥闯鯩SFix和上面3種修復(fù)工具相比,其修復(fù)的正確補(bǔ)丁數(shù)量是最多的,一共修復(fù)了21個(gè),而其它3個(gè)工具卻修復(fù)沒有超過有效補(bǔ)丁數(shù)量的一半。并且MSFix的召回率和準(zhǔn)確率都分別達(dá)到了62.90%和53.85%。其它3種工具的召回率和準(zhǔn)確率都比較偏低。

        表5 4種工具對(duì)比的整體實(shí)驗(yàn)結(jié)果

        使用Venn圖來展示這4個(gè)工具所修復(fù)缺陷之間的交叉重疊情況。由表5和圖3可知,jGenProg和jKal的召回率相對(duì)較低,并且被jGenProg和jKal這兩個(gè)工具修復(fù)的缺陷都能夠被Nopel和MSFix修復(fù)。MSFix和與Nopel相比,MSFix能夠修復(fù)17個(gè)Nopel無法修復(fù)的缺陷,召回率提高了22.58%。

        圖3 4個(gè)工具修復(fù)缺陷韋恩

        由于jGenProg和jKali在基于各自定義的操作修改缺陷程序形成候選補(bǔ)丁時(shí),對(duì)所有類型的缺陷都執(zhí)行相同的修復(fù)操作。雖然能夠修復(fù)條件語句缺陷,但相比于MSFix和Nopol,jGenProg和jKali,缺少更有針對(duì)性的分析。因此,在修復(fù)條件語句缺陷時(shí),jGenProg和jKali生成的有效補(bǔ)丁相對(duì)較少,缺陷修復(fù)較低。另外,Nopol在生成候選補(bǔ)丁時(shí),只使用了基于約束求解的補(bǔ)丁生成方法。本文方案則在此基礎(chǔ)之上,增加、并且優(yōu)先使用變異技術(shù)生成程序補(bǔ)丁,綜合使用兩種補(bǔ)丁生成方法,使得對(duì)條件語句缺陷具有更高的修復(fù)率。

        在補(bǔ)丁準(zhǔn)確率方面,4個(gè)工具都基于測試套件進(jìn)行修復(fù),但本文方法在生成程序補(bǔ)丁時(shí),優(yōu)先考慮使用變異技術(shù)對(duì)原始表達(dá)式進(jìn)行變異,基于真實(shí)的缺陷修復(fù)記錄,為條件語句定義合適的變異算子,該方法更可能產(chǎn)生符合開發(fā)人員預(yù)期的程序補(bǔ)丁。因此,MSFix能夠優(yōu)先輸出正確的程序補(bǔ)丁,補(bǔ)丁準(zhǔn)確率相對(duì)其它3種方法都有所提高。

        7 結(jié)束語

        缺陷自動(dòng)修復(fù)方法是幫助開發(fā)人員減少調(diào)試成本的有效技術(shù),為了修復(fù)Java程序中常見的條件語句缺失缺陷和條件語句邏輯錯(cuò)誤缺陷,本文提出了基于變異分析和約束求解的程序補(bǔ)丁合成技術(shù),實(shí)驗(yàn)結(jié)果表明本文方案能夠修復(fù)真實(shí)的條件語句缺陷,并且相比于現(xiàn)有修復(fù)方法,本文方案具有更好的修復(fù)效果。在相當(dāng)程度上解決了Java程序中條件語句缺陷的自動(dòng)修復(fù)問題。但本文的研究基于Java程序,對(duì)其它語言的適應(yīng)性還有待進(jìn)一步的實(shí)驗(yàn)驗(yàn)證。在變異分析中,只采取了3種變異算子,在未來工作中,可以考慮增加更多的變異算子,以提高缺陷修復(fù)的能力;此外實(shí)驗(yàn)結(jié)果表明本方法修復(fù)的補(bǔ)丁和現(xiàn)有的工具相比,修復(fù)的補(bǔ)丁既有重疊的又有獨(dú)有的,為了提高缺陷自動(dòng)修復(fù)的可靠性和完備性,在未來工作中,可以考慮綜合使用補(bǔ)丁修復(fù)的工具,對(duì)本文方法做出進(jìn)一步的改進(jìn),以提高補(bǔ)丁修復(fù)率。

        猜你喜歡
        測試用例補(bǔ)丁表達(dá)式
        基于SmartUnit的安全通信系統(tǒng)單元測試用例自動(dòng)生成
        一個(gè)混合核Hilbert型積分不等式及其算子范數(shù)表達(dá)式
        表達(dá)式轉(zhuǎn)換及求值探析
        淺析C語言運(yùn)算符及表達(dá)式的教學(xué)誤區(qū)
        健胃補(bǔ)丁
        學(xué)與玩(2018年5期)2019-01-21 02:13:06
        繡朵花兒當(dāng)補(bǔ)丁
        文苑(2018年18期)2018-11-08 11:12:30
        基于混合遺傳算法的回歸測試用例集最小化研究
        補(bǔ)丁奶奶
        幼兒畫刊(2018年7期)2018-07-24 08:25:56
        基于依賴結(jié)構(gòu)的測試用例優(yōu)先級(jí)技術(shù)
        大病醫(yī)保期待政策“補(bǔ)丁”
        日韩国产一区二区三区在线观看| 青青草国产成人99久久| 无码之国产精品网址蜜芽| 在线免费观看国产视频不卡| 亚洲网站一区在线播放| 亚洲av成人噜噜无码网站| 免费黄色电影在线观看| 无码专区亚洲avl| 午夜视频在线观看国产19| 国产综合色在线视频区| 内射精品无码中文字幕| A阿V天堂免费无码专区| 日本一区二区三区精品免费| 少妇夜夜春夜夜爽试看视频 | a国产一区二区免费入口| 亚洲欧美日韩中文综合在线不卡| 久久国产精品色av免费看| 狠狠躁18三区二区一区| 国产乱理伦片在线观看| 中文字幕午夜AV福利片| 日本女优激情四射中文字幕| 国产成人精品a视频| 亚洲成在人线久久综合| 国产在线拍91揄自揄视精品91| 一道本久久综合久久鬼色| 欧美极品jizzhd欧美| 麻豆国产巨作AV剧情老师| 国产一区二区三区免费在线播放| 人妻熟妇乱又伦精品视频| 久久久精品人妻一区二区三区四 | 欧美日韩国产专区| 91国产视频自拍在线观看| 大尺度无遮挡激烈床震网站| 日本大尺度吃奶呻吟视频| 丰满熟妇人妻无码区| 国产天堂av在线播放资源| 日韩精品极品视频在线观看免费 | 亚洲av国产av综合av卡| 人禽无码视频在线观看| 国产在线精品亚洲视频在线 | 日本加勒比精品一区二区视频|