?

基于程序變異的故障注入及故障規則庫的設計

2010-11-07 08:19徐麗中國礦業大學計算機科學與技術學院221008
中國科技信息 2010年22期
關鍵詞:故障注入數組除數

徐麗 中國礦業大學計算機科學與技術學院 221008

基于程序變異的故障注入及故障規則庫的設計

徐麗 中國礦業大學計算機科學與技術學院 221008

1. 基于程序變異的軟件故障注入方法

軟件故障注入的方法有很多種,本節著重介紹利用插入的故障代碼違反程序中函數的滿足條件(前置條件、后置條件或其它),改變其狀態,迫使軟件出現故障,使程序偏移正常的控制流,從而達到引發異常,執行異常處理代碼的軟件故障注入方法。

1.1 基于斷言違背的軟件故障注入方法

對于違背語言規則或違背系統規則的隱式引發的異常,根據異常處理結構的抽取信息,對try塊中的每個語句可以采用基于斷言違背的軟件故障注入法進行故障注入。假設程序中有下列的語句:

int [ , ]a=new int [2][3]

該語句執行的前置條件是數組的下標的滿足條件,由于C#中默認的下標起始值為0,所以下標的范圍定義為0到下標值減去1,即我們對于上述定義的數組,可以取到的范圍為 int [0][0]-int [1][2]我們所采用的斷言違背的故障注入則有以下幾種可能來進行注入,從而引發所對應的異常。

在測試時只需改變數組下標的值,就可以改變注入的錯誤,從而引發不可達的異常,注入故障后即可進行異常機制的測試。

對于用戶自定義異常,根據抽取的異常處理結構信息,針對引發異常的條件則可以進行故障注入。分為兩種情況:一種是基于斷言違背的軟件故障注入方法,假設在程序的源代碼中有如下的一個語句:

if (0<=i && i

throw

ArrayIndexOutOfBoundsException;

則可以采用與上面類似的故障注入程序來進行。另一種是普通的故障注入方法,假設在程序的源代碼中有如下的一個語句:

if ( currValue == 0 )

throw new ZeroValueException();

則在進行故障注入時,可以直接對currValue賦值為0,即可引發ZeroValueException(),測試源程序不可達的異常代碼,增大測試的覆蓋面。

1.2 在條件中插入真值的軟件故障注入方法

從上面的例子中可以看出,基于斷言違背的軟件故障注入技術可以很好地仿真這類軟件故障。但如果在條件語句中涉及到系統調用,那么通過簡單的程序變異或斷言違背技術通常無法直接修改系統調用的返回結果。本文在設計實現時,擬采用在條件中插入真值法來注入故障,從而引發異常。假設有下列語句:

if (p=malloc(sizeof(int))= =NULL) throw OutOfMemoryException;

因為這個語句是一個系統函數,并且不能直接訪問它的源代碼。為了測試由該異常引發的異常處理代碼段,可以將上式條件語句轉化為如下形式:

if (p=malloc(sizeof(int))= =NULL||true ) throw OutOfMemoryException;

此方法擴大了if語句的條件判斷范圍,無論系統調用函數運行的結果如何,在并上條件為真的情況下,都將引發異常,執行相應的異常處理語句,達到測試異常機制的目的。

1.3 逆向設置的軟件故障注入方法

本節主要針對關系表達式和布爾表達式進行研究和討論,在原程序中做一個很少的語法改變即可得到一個變異程序。例如,一個大于號“>”可以改變為“≥”,可以測試到異常處理代碼;我們也可以在條件語句中改變操作數讓程序轉去執行異常處理代碼。假設有下列語句:

a>5,a+b<10;

我們可以根據逆向設置的方法,將此關系表達式改變如下:

a=5,a+b=10;

讓程序的代碼在語法上做一個很小的改動,從而引發預期的異常。

2.故障注入規則庫的設計與生成

本節特別有針對性的選擇了幾種常見的異常情況,對其進行可發生故障的分析,特別對可能發生的故障設計了故障注入規則庫,以確定原程序中的故障注入點以及故障注入的可選列表。

2.1 故障注入規則庫的設計

本小節主要針對常見的異常類型,例如:除數為0,數組邊界值越界,關系表達式的符號判斷條件等進行詳細分析和歸納,以具體的示例來設計故障注入規則庫,以解決故障注入的問題。

2.1.1 除數為0的示例

常見的異常類型中,除數為0是比較典型的,由于除數不能為0的原則,使得在這個判斷原則的基礎上,只要遇到除數為0,則引發除數為0的異常,使程序執行其所引發的異常語句。

2.1.2 If判斷條件示例

我們以If條件中的關系表達式為例,其示如例圖2所示:

圖1 除數異常示例圖

特別注意的是,判斷條件的故障注入的可選列表的設計,我們是基于簡單的程序變異,抽取出表達式符號后,根據斷言違背或逆向設置等條件列出可以引發故障的注入條件,從而引發故障。

2.1.3 數組越界的示例

關于數組的異常判斷,關鍵在于下標的邊界值是否越界,按照數組邊界值的定義,我們一般取兩種情況來引發數組的異常:取一個下標的上界;取一個下標的下界。由于C#語言的數組下標的起始值為0,所以,在規則庫的設計中,我們取下界為-1,上界為抽取出的數組的邊界值。從而確定了針對一維數組的故障注入的兩個可選擇的條件。

2.2 故障注入規則庫的生成與實現

我們根據第1節所介紹的幾種軟件故障注入方法,將相對應的異常程序分析整合,主要包括以下幾種異常處理的測試:

1)if的條件判斷所引發的異常

① || 關系表達式

②單一關系表達式(包括:= = , ! = ,> =, < =, >, <)

③布爾表達式(true、false)

2)除數為0所引發的異常

3)數組索引值越界

①一元數組下標范圍;②二元數組下標范圍

圖2 If判斷條件注入示例圖

4)調用系統函數所引發的異常

此測試用例的主要程序變異如下:

1)int[]a=new int[8];

a[4]=123; //數組邊界值示例

一元數組邊界值的范圍為a[0]—a[7],所以引發異常的邊界值越界主要有以下兩種選擇:

① a[-1]=123;

② a[8]=123

2)int nTheZero=10;

int nResult=100/nTheZero; //判斷除數為0示例

若要引發除數為0的異常,則要把變量nTheZero賦值0即可引發C#的標準異常類DivideByZeroException。

3)if(num= =99) //if的= =判斷條件(自定義異常)

throw new Exception();

在本測試用例中,自定義異常為,當num值恒等于99時,拋出自定義的異常,輸出“Game Over!”。

由于測試用例中num是一個隨機的值,所以恒等于99的幾率非常的小,我們改變“= =”的條件,以達到以滿足引發異常的條件,如:

① 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 ;

任意選擇其中的一種條件,引發基本異常類ArgumentOutOfRangeException,從而執行相對應的異常處理語句,達到測試異常處理機制的目的。

10.3969/j.issn.1001-8972.2010.22.052

猜你喜歡
故障注入數組除數
模擬訓練裝備故障注入系統研究
JAVA稀疏矩陣算法
除法中的數學問題
除法中的簡便計算
JAVA玩轉數學之二維數組排序
你會算嗎——以“除數是一位數的除法”為例
余數一定要比除數小
一種多類型總線故障注入系統設計*
某型自動裝彈機故障注入系統研究
更高效用好 Excel的數組公式
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合