徐麗 中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 221008
基于程序變異的故障注入及故障規(guī)則庫(kù)的設(shè)計(jì)
徐麗 中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 221008
軟件故障注入的方法有很多種,本節(jié)著重介紹利用插入的故障代碼違反程序中函數(shù)的滿足條件(前置條件、后置條件或其它),改變其狀態(tài),迫使軟件出現(xiàn)故障,使程序偏移正常的控制流,從而達(dá)到引發(fā)異常,執(zhí)行異常處理代碼的軟件故障注入方法。
對(duì)于違背語(yǔ)言規(guī)則或違背系統(tǒng)規(guī)則的隱式引發(fā)的異常,根據(jù)異常處理結(jié)構(gòu)的抽取信息,對(duì)try塊中的每個(gè)語(yǔ)句可以采用基于斷言違背的軟件故障注入法進(jìn)行故障注入。假設(shè)程序中有下列的語(yǔ)句:
int [ , ]a=new int [2][3]
該語(yǔ)句執(zhí)行的前置條件是數(shù)組的下標(biāo)的滿足條件,由于C#中默認(rèn)的下標(biāo)起始值為0,所以下標(biāo)的范圍定義為0到下標(biāo)值減去1,即我們對(duì)于上述定義的數(shù)組,可以取到的范圍為 int [0][0]-int [1][2]我們所采用的斷言違背的故障注入則有以下幾種可能來(lái)進(jìn)行注入,從而引發(fā)所對(duì)應(yīng)的異常。
在測(cè)試時(shí)只需改變數(shù)組下標(biāo)的值,就可以改變注入的錯(cuò)誤,從而引發(fā)不可達(dá)的異常,注入故障后即可進(jìn)行異常機(jī)制的測(cè)試。
對(duì)于用戶自定義異常,根據(jù)抽取的異常處理結(jié)構(gòu)信息,針對(duì)引發(fā)異常的條件則可以進(jìn)行故障注入。分為兩種情況:一種是基于斷言違背的軟件故障注入方法,假設(shè)在程序的源代碼中有如下的一個(gè)語(yǔ)句:
if (0<=i && i throw ArrayIndexOutOfBoundsException; 則可以采用與上面類似的故障注入程序來(lái)進(jìn)行。另一種是普通的故障注入方法,假設(shè)在程序的源代碼中有如下的一個(gè)語(yǔ)句: if ( currValue == 0 ) throw new ZeroValueException(); 則在進(jìn)行故障注入時(shí),可以直接對(duì)currValue賦值為0,即可引發(fā)ZeroValueException(),測(cè)試源程序不可達(dá)的異常代碼,增大測(cè)試的覆蓋面。 從上面的例子中可以看出,基于斷言違背的軟件故障注入技術(shù)可以很好地仿真這類軟件故障。但如果在條件語(yǔ)句中涉及到系統(tǒng)調(diào)用,那么通過(guò)簡(jiǎn)單的程序變異或斷言違背技術(shù)通常無(wú)法直接修改系統(tǒng)調(diào)用的返回結(jié)果。本文在設(shè)計(jì)實(shí)現(xiàn)時(shí),擬采用在條件中插入真值法來(lái)注入故障,從而引發(fā)異常。假設(shè)有下列語(yǔ)句: if (p=malloc(sizeof(int))= =NULL) throw OutOfMemoryException; 因?yàn)檫@個(gè)語(yǔ)句是一個(gè)系統(tǒng)函數(shù),并且不能直接訪問(wèn)它的源代碼。為了測(cè)試由該異常引發(fā)的異常處理代碼段,可以將上式條件語(yǔ)句轉(zhuǎn)化為如下形式: if (p=malloc(sizeof(int))= =NULL||true ) throw OutOfMemoryException; 此方法擴(kuò)大了if語(yǔ)句的條件判斷范圍,無(wú)論系統(tǒng)調(diào)用函數(shù)運(yùn)行的結(jié)果如何,在并上條件為真的情況下,都將引發(fā)異常,執(zhí)行相應(yīng)的異常處理語(yǔ)句,達(dá)到測(cè)試異常機(jī)制的目的。 本節(jié)主要針對(duì)關(guān)系表達(dá)式和布爾表達(dá)式進(jìn)行研究和討論,在原程序中做一個(gè)很少的語(yǔ)法改變即可得到一個(gè)變異程序。例如,一個(gè)大于號(hào)“>”可以改變?yōu)椤啊荨?,可以測(cè)試到異常處理代碼;我們也可以在條件語(yǔ)句中改變操作數(shù)讓程序轉(zhuǎn)去執(zhí)行異常處理代碼。假設(shè)有下列語(yǔ)句: a>5,a+b<10; 我們可以根據(jù)逆向設(shè)置的方法,將此關(guān)系表達(dá)式改變?nèi)缦拢?/p> a=5,a+b=10; 讓程序的代碼在語(yǔ)法上做一個(gè)很小的改動(dòng),從而引發(fā)預(yù)期的異常。 本節(jié)特別有針對(duì)性的選擇了幾種常見(jiàn)的異常情況,對(duì)其進(jìn)行可發(fā)生故障的分析,特別對(duì)可能發(fā)生的故障設(shè)計(jì)了故障注入規(guī)則庫(kù),以確定原程序中的故障注入點(diǎn)以及故障注入的可選列表。 本小節(jié)主要針對(duì)常見(jiàn)的異常類型,例如:除數(shù)為0,數(shù)組邊界值越界,關(guān)系表達(dá)式的符號(hào)判斷條件等進(jìn)行詳細(xì)分析和歸納,以具體的示例來(lái)設(shè)計(jì)故障注入規(guī)則庫(kù),以解決故障注入的問(wèn)題。 2.1.1 除數(shù)為0的示例 常見(jiàn)的異常類型中,除數(shù)為0是比較典型的,由于除數(shù)不能為0的原則,使得在這個(gè)判斷原則的基礎(chǔ)上,只要遇到除數(shù)為0,則引發(fā)除數(shù)為0的異常,使程序執(zhí)行其所引發(fā)的異常語(yǔ)句。 2.1.2 If判斷條件示例 我們以If條件中的關(guān)系表達(dá)式為例,其示如例圖2所示: 圖1 除數(shù)異常示例圖 特別注意的是,判斷條件的故障注入的可選列表的設(shè)計(jì),我們是基于簡(jiǎn)單的程序變異,抽取出表達(dá)式符號(hào)后,根據(jù)斷言違背或逆向設(shè)置等條件列出可以引發(fā)故障的注入條件,從而引發(fā)故障。 2.1.3 數(shù)組越界的示例 關(guān)于數(shù)組的異常判斷,關(guān)鍵在于下標(biāo)的邊界值是否越界,按照數(shù)組邊界值的定義,我們一般取兩種情況來(lái)引發(fā)數(shù)組的異常:取一個(gè)下標(biāo)的上界;取一個(gè)下標(biāo)的下界。由于C#語(yǔ)言的數(shù)組下標(biāo)的起始值為0,所以,在規(guī)則庫(kù)的設(shè)計(jì)中,我們?nèi)∠陆鐬?1,上界為抽取出的數(shù)組的邊界值。從而確定了針對(duì)一維數(shù)組的故障注入的兩個(gè)可選擇的條件。 我們根據(jù)第1節(jié)所介紹的幾種軟件故障注入方法,將相對(duì)應(yīng)的異常程序分析整合,主要包括以下幾種異常處理的測(cè)試: 1)if的條件判斷所引發(fā)的異常 ① || 關(guān)系表達(dá)式 ②單一關(guān)系表達(dá)式(包括:= = , ! = ,> =, < =, >, <) ③布爾表達(dá)式(true、false) 2)除數(shù)為0所引發(fā)的異常 3)數(shù)組索引值越界 ①一元數(shù)組下標(biāo)范圍;②二元數(shù)組下標(biāo)范圍 圖2 If判斷條件注入示例圖 4)調(diào)用系統(tǒng)函數(shù)所引發(fā)的異常 此測(cè)試用例的主要程序變異如下: 1)int[]a=new int[8]; a[4]=123; //數(shù)組邊界值示例 一元數(shù)組邊界值的范圍為a[0]—a[7],所以引發(fā)異常的邊界值越界主要有以下兩種選擇: ① a[-1]=123; ② a[8]=123 2)int nTheZero=10; int nResult=100/nTheZero; //判斷除數(shù)為0示例 若要引發(fā)除數(shù)為0的異常,則要把變量nTheZero賦值0即可引發(fā)C#的標(biāo)準(zhǔn)異常類DivideByZeroException。 3)if(num= =99) //if的= =判斷條件(自定義異常) throw new Exception(); 在本測(cè)試用例中,自定義異常為,當(dāng)num值恒等于99時(shí),拋出自定義的異常,輸出“Game Over!”。 由于測(cè)試用例中num是一個(gè)隨機(jī)的值,所以恒等于99的幾率非常的小,我們改變“= =”的條件,以達(dá)到以滿足引發(fā)異常的條件,如: ① num != 99 ; ② num > = 99 ;③num < = 99 ; ④ num > 99 ; ⑤ num < 99 ; 4)if(n<0) throw(new ArgumentOutOfRangeException()); //if的<判斷條件 有以下幾種可選擇的注入條件: ①n = = 0 ; ② n > = 0 ; ③ n < = 0 ; ④ num > 0 ; ⑤ n ! = 0 ; 任意選擇其中的一種條件,引發(fā)基本異常類ArgumentOutOfRangeException,從而執(zhí)行相對(duì)應(yīng)的異常處理語(yǔ)句,達(dá)到測(cè)試異常處理機(jī)制的目的。 10.3969/j.issn.1001-8972.2010.22.0521.2 在條件中插入真值的軟件故障注入方法
1.3 逆向設(shè)置的軟件故障注入方法
2.故障注入規(guī)則庫(kù)的設(shè)計(jì)與生成
2.1 故障注入規(guī)則庫(kù)的設(shè)計(jì)
2.2 故障注入規(guī)則庫(kù)的生成與實(shí)現(xiàn)