曹克浩
摘 要 程序的可維護(hù)性和可靠性已經(jīng)成為軟件產(chǎn)業(yè)發(fā)展的突出難題,如何快速鎖定故障,如何有效修復(fù)軟件已經(jīng)成為當(dāng)前軟件工程實(shí)踐中最重要的活動(dòng)之一?;谧儺惖某绦蚬收闲迯?fù)技術(shù),在闡述C程序表達(dá)式故障的方法中,利用變異修復(fù)機(jī)制來(lái)輔助修復(fù)程序故障,并通過(guò)實(shí)例故障來(lái)驗(yàn)證方法的有效性。
關(guān)鍵詞 程序軟件 變異技術(shù) 故障定位 修復(fù)方法
計(jì)算機(jī)技術(shù)的發(fā)展,特別是軟件技術(shù)的廣泛應(yīng)用,越來(lái)越多的程序在出現(xiàn)故障后帶來(lái)了更多維護(hù)性難題。軟件測(cè)試技術(shù)的發(fā)展,主要針對(duì)軟件程序運(yùn)行可靠性問(wèn)題,從程序故障的鎖定及修復(fù)中來(lái)提升軟件質(zhì)量。美國(guó)標(biāo)準(zhǔn)與技術(shù)研究所NIST調(diào)查顯示,軟件程序故障修復(fù)的成本每年達(dá)到595億美元,約占總GDP的0.6%。程序故障修復(fù)作為軟件工程實(shí)踐中的重要內(nèi)容,在軟件修復(fù)程序中耗時(shí)、費(fèi)力,且完全依賴于軟件開(kāi)發(fā)人員的專業(yè)知識(shí)和行業(yè)經(jīng)驗(yàn)。這種現(xiàn)象不僅加長(zhǎng)了軟件開(kāi)發(fā)周期,也阻礙了軟件產(chǎn)業(yè)的快速發(fā)展。因此,積極從軟件程序修復(fù)技術(shù)及理論研究中,就軟件行業(yè)程序故障修復(fù)問(wèn)題進(jìn)行探討,并從軟件故障修復(fù)實(shí)踐中來(lái)開(kāi)發(fā)自動(dòng)化修復(fù)工具,以改善軟件程序故障修復(fù)的缺陷。
一、當(dāng)前軟件程序故障修復(fù)現(xiàn)狀及方法研究
從軟件技術(shù)開(kāi)發(fā)實(shí)踐來(lái)看,軟件程序故障是軟件工程的重要內(nèi)容,當(dāng)前軟件開(kāi)發(fā)人員在面臨程序故障修復(fù)時(shí),多以手工方式來(lái)進(jìn)行故障定位和修復(fù),使得程序開(kāi)發(fā)周期較長(zhǎng),成本較高。國(guó)內(nèi)外對(duì)軟件故障修復(fù)理論的研究也取得了一定進(jìn)展,特別是在內(nèi)存管理、數(shù)據(jù)結(jié)構(gòu)修復(fù)及特定數(shù)據(jù)類型的故障提示中也取得一定成績(jī)。Dallmeier等人通過(guò)對(duì)軟件運(yùn)行與失敗的差異分析,利用回歸測(cè)試用例來(lái)減少程序修復(fù)后產(chǎn)生的新問(wèn)題;Perkins等人通過(guò)不變式監(jiān)控程序的方法,就匯編級(jí)程序錯(cuò)誤進(jìn)行自動(dòng)檢測(cè)和修復(fù)。然而,這兩種方法主要針對(duì)條件表達(dá)式或監(jiān)控器軟件相關(guān)的錯(cuò)誤修復(fù)。Arcuri等人首次以遺傳編程自動(dòng)修復(fù)方法,根據(jù)程序規(guī)模的擴(kuò)大,利用遺傳編程搜索方法來(lái)進(jìn)行修復(fù),較為適宜單個(gè)函數(shù)的修復(fù);Weimer等人為了縮小進(jìn)化算子的搜索空間,采用抽象語(yǔ)法樹(shù)先對(duì)程序進(jìn)行抽象,再通過(guò)基于遺傳的編程方法就C語(yǔ)言程序和匯編語(yǔ)言程序進(jìn)行修復(fù)。我國(guó)學(xué)者何加浪等人在Weimer研究基礎(chǔ)上,利用不變量約束來(lái)對(duì)搜索空間進(jìn)行簡(jiǎn)化,并針對(duì)測(cè)試過(guò)程難以覆蓋所有功能需求,提出成功測(cè)試用例學(xué)習(xí)的不變量約束來(lái)解決該難題;成功測(cè)試用例與失敗測(cè)試用例所執(zhí)行的路徑不同,對(duì)于程序故障及修復(fù)方法也不一致,反而限制了程序修復(fù)的類型;另外,該方法在修復(fù)過(guò)程中還產(chǎn)生大量無(wú)關(guān)冗余的代碼轉(zhuǎn)換;遺傳算法本身的非穩(wěn)定性,在程序本身的變化中也存在適應(yīng)性問(wèn)題。
二、基于變異技術(shù)的軟件故障修復(fù)原理及步驟
(1)基于變異技術(shù)的軟件故障修復(fù)原理。傳統(tǒng)基于變異的測(cè)試技術(shù)是對(duì)已知程序,根據(jù)變異算子來(lái)得到一批程序故障變異體,利用這些變異體來(lái)對(duì)測(cè)試用例集T進(jìn)行測(cè)試。而新的基于變異技術(shù)的程序故障修復(fù)技術(shù),則是將之作為故障程序,根據(jù)變異算子來(lái)選擇故障程序的變異,從而得到一批變異體,利用已知的測(cè)試用例集來(lái)對(duì)這些變異體進(jìn)行驗(yàn)證,以得到程序故障修復(fù)目標(biāo)。在制定變異體是否修復(fù)軟件故障時(shí),首先需要定義變異體的標(biāo)準(zhǔn),即對(duì)于變異體執(zhí)行完成后的輸出結(jié)果與期望不一致。任何一個(gè)被放棄的變異體都不能是故障程序的正確修復(fù)版本,原因是這些變異體曾導(dǎo)致測(cè)試用例執(zhí)行失敗。相反,如果一個(gè)變異體順利通過(guò)測(cè)試用例,說(shuō)明本變異體被故障程序進(jìn)行正確修復(fù)。通過(guò)對(duì)這些潛在修復(fù)版本的分析,可以幫助程序開(kāi)發(fā)人員得到期望的程序。
(2)故障程序修復(fù)實(shí)施步驟?;谧儺惣夹g(shù)的故障程序修復(fù)方法,其具體實(shí)施步驟表示如下:一是要確定故障類型,利用程序變異技術(shù)對(duì)某類特定的程序故障進(jìn)行測(cè)試,在修復(fù)之前,首先要明確變異修復(fù)程序的故障類型。程序設(shè)計(jì)人員在對(duì)程序常見(jiàn)故障類型進(jìn)行分析,并從發(fā)生概率高且危害大的故障類型進(jìn)行修復(fù),有助于提升軟件的修復(fù)效果,降低軟件開(kāi)發(fā)成本。二是選擇合適的變異算子,對(duì)于變異算子是基于變異技術(shù)的故障修復(fù)方法,也是產(chǎn)生變異體的基礎(chǔ)。通過(guò)導(dǎo)入多元化變異算子,能夠從不同類型的故障測(cè)試中進(jìn)行修復(fù),最大化的提升變異體的生成。程序故障修復(fù)方法應(yīng)該能滿足不同類型的故障測(cè)試,高效的修復(fù)方法需要變異修復(fù)的代價(jià)盡可能小。因此,在對(duì)變異算子的設(shè)計(jì)上,要從執(zhí)行效率和變異體修復(fù)效果上來(lái)針對(duì)不同程序故障類型進(jìn)行修復(fù)。三是設(shè)定變異修復(fù)停止條件。在進(jìn)行變異技術(shù)故障修復(fù)執(zhí)行過(guò)程中,對(duì)于某些特定的程序故障,并不是所有程序故障都能夠得到修復(fù),只有當(dāng)產(chǎn)生并檢查一定數(shù)量的變異體后,如果找不到對(duì)應(yīng)的修復(fù)版本的變異體,則會(huì)提示:繼續(xù)還是停止;如果選擇繼續(xù),則進(jìn)行再次修復(fù)版本變異體的查找,否則直到找到變異體被檢查出,修復(fù)程序并不停止。通常情況下,對(duì)于修復(fù)對(duì)象為大型程序軟件時(shí),對(duì)于變異體的數(shù)量要求也較大,如果選擇繼續(xù)則會(huì)浪費(fèi)系統(tǒng)資源,因此需要設(shè)置一個(gè)停止條件。三是變異故障程序,對(duì)于所設(shè)計(jì)的變異算子本身,由于設(shè)置的變異修復(fù)停止條件不同,對(duì)故障程序進(jìn)行變異產(chǎn)生變異體時(shí),可以先利用故障定位技術(shù)來(lái)對(duì)故障程序進(jìn)行明確,再利用故障檢測(cè)結(jié)果來(lái)選擇修復(fù)程序故障,從而降低修復(fù)代價(jià)。四是確定修復(fù)變異體版本,并通過(guò)變異故障程序返回到產(chǎn)生新的變異體,以檢查和確定故障程序的潛在修復(fù)版本。
三、C語(yǔ)言程序故障修復(fù)方法
(1)C語(yǔ)言程序故障類型劃分。C語(yǔ)言軟件開(kāi)發(fā)常用語(yǔ)言,在對(duì)C語(yǔ)言程序進(jìn)行故障修復(fù)測(cè)試中,需要對(duì)所提供的故障系統(tǒng)類型進(jìn)行分析,總的來(lái)說(shuō)歸結(jié)為四類:即內(nèi)存故障,以內(nèi)存資源釋放、分配錯(cuò)誤、函數(shù)返回值錯(cuò)誤、非法指針應(yīng)用錯(cuò)誤等;條件表達(dá)式錯(cuò)誤,通常表現(xiàn)在If、While、For結(jié)構(gòu)開(kāi)頭的條件表達(dá)式,其錯(cuò)誤主要與關(guān)系運(yùn)算符、邏輯運(yùn)算符及邊界條件故障有關(guān);變量賦值錯(cuò)誤,其故障主要發(fā)生在變量賦值語(yǔ)句中,如某些運(yùn)算符或邊界賦值錯(cuò)誤而引發(fā)的變量賦值故障;語(yǔ)句冗余或缺失類錯(cuò)誤,隨著程序工作流程和設(shè)計(jì)流程的差異而導(dǎo)致程序執(zhí)行失敗。
(2)C語(yǔ)言變異算子的設(shè)計(jì)。變異算子是程序故障修復(fù)的關(guān)鍵,也是基于變異測(cè)試技術(shù)最常用的程序變異體。變異算子在設(shè)計(jì)上主要從算術(shù)運(yùn)算符的變異、關(guān)系運(yùn)算符的變異,以及邏輯運(yùn)算符的變異中來(lái)完成。針對(duì)程序中常用的運(yùn)算符,能夠從運(yùn)算符錯(cuò)誤引起的變量賦值故障或條件表達(dá)式故障中,對(duì)包含算術(shù)、關(guān)系、邏輯運(yùn)算符的程序語(yǔ)言進(jìn)行測(cè)試。針對(duì)程序設(shè)計(jì)中的條件表達(dá)式、變量賦值故障,以及語(yǔ)句冗余或賦值缺失等故障,從變異算子的設(shè)計(jì)上,能夠?qū)崿F(xiàn)對(duì)每一類特殊故障類型的修復(fù),如多一些子類型故障進(jìn)行修復(fù),就需要從程序發(fā)生錯(cuò)誤的概率中進(jìn)行針對(duì)性設(shè)計(jì),優(yōu)先為故障發(fā)生率高的程序設(shè)計(jì)相應(yīng)的變異算子。
(3)變異算子處理方法。針對(duì)不同類型的變異算子,在進(jìn)行變異故障修復(fù)中,對(duì)于運(yùn)算符變異,從常用運(yùn)算符如算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、自增/自減運(yùn)算符、位操作符、賦值運(yùn)算符等,利用替換運(yùn)算符進(jìn)行變異,能夠修復(fù)的故障類型主要有變量賦值故障和條件表達(dá)式故障。如對(duì)于條件表達(dá)式中的變異,針對(duì)可疑程序語(yǔ)句的條件表達(dá)式,從整體取反進(jìn)行變異,或者通過(guò)整體加1或減1來(lái)進(jìn)行變異;對(duì)于邊界值變異,針對(duì)可疑語(yǔ)句中的For循環(huán),通過(guò)初始量增1或減1進(jìn)行變異;對(duì)于初始化變量賦值偏差錯(cuò)誤,可疑通過(guò)賦值方法進(jìn)行修復(fù);對(duì)于常量浮點(diǎn)變異,針對(duì)可疑語(yǔ)句進(jìn)行變異成等值的浮點(diǎn)型常量,如float a=1/2;假設(shè)程序?qū)的期望值為0.5,根據(jù)C語(yǔ)言語(yǔ)法,可疑從分子分母整型常量賦值中來(lái)引發(fā)變量賦值故障,以完成對(duì)錯(cuò)誤的修復(fù)。對(duì)于類型擴(kuò)展變異,通過(guò)對(duì)可疑程序語(yǔ)句中的float、int等關(guān)鍵字,將其變異為高一級(jí)類型,以修復(fù)由精度缺失帶來(lái)的變量賦值故障。
(4)變量修復(fù)停止條件。從程序故障修復(fù)方法中,必須要對(duì)不能修復(fù)的故障類型,以及找不到潛在修復(fù)版本的情況進(jìn)行終止修復(fù),這就需要從變異修復(fù)中設(shè)定某一停止條件。如當(dāng)變異修復(fù)所使用的代價(jià)高于某一限值時(shí),仍未找到潛在修復(fù)版本的變異體就會(huì)返回程序終止。簡(jiǎn)言之,對(duì)于某一變異體從產(chǎn)生到執(zhí)行完所用的代價(jià)為e,若在找到潛在修復(fù)版本時(shí)需要檢查n個(gè)變異體,則此次修復(fù)代價(jià)為;可見(jiàn),對(duì)于變異修復(fù)代價(jià)主要取決于n值大小,也就是修復(fù)過(guò)程所檢查的變異體數(shù)量。
(5)潛在修復(fù)版本的確定。基于變異技術(shù)的程序故障修復(fù),是對(duì)程序在執(zhí)行過(guò)程中對(duì)變異體進(jìn)行所有測(cè)試用例后還活著,則說(shuō)明該變異體為潛在修復(fù)版本。同樣,在變異修復(fù)程序設(shè)計(jì)上,還應(yīng)該至少包括一個(gè)失敗測(cè)試用例,與潛在修復(fù)版本具有不同的輸出結(jié)果。基于變異技術(shù)的故障修復(fù)方法,并沒(méi)有對(duì)所有測(cè)試用例的數(shù)量進(jìn)行限制,當(dāng)每次測(cè)試用例集中的測(cè)試用例數(shù)量過(guò)多時(shí),則會(huì)帶來(lái)更大的驗(yàn)證變異體的代價(jià)。因此,可以對(duì)測(cè)試用例集的選取進(jìn)行確定,以避免變異體修復(fù)所花費(fèi)的代價(jià)過(guò)多。程序設(shè)計(jì)人員可以從測(cè)試用例集的選擇上,先對(duì)測(cè)試用例集進(jìn)行優(yōu)化,再進(jìn)行故障程序變異修復(fù)。
參考文獻(xiàn):
[1]陳翔,顧慶.變異測(cè)試:原理、優(yōu)化和應(yīng)用[J].計(jì)算機(jī)科學(xué)與探索, 2012(12).
[2]周改云,張國(guó)平,呂瓊帥,黎遠(yuǎn)松.利用智能控制流方法的嵌入式軟件故障檢測(cè)[J].電子技術(shù)應(yīng)用,2015(10).
(作者單位:河南財(cái)政稅務(wù)高等專科學(xué)校)