国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于程序變異的故障注入及故障規(guī)則庫(kù)的設(shè)計(jì)

2010-11-07 08:19:50徐麗中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院221008
中國(guó)科技信息 2010年22期
關(guān)鍵詞:邊界值故障注入數(shù)組

徐麗 中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 221008

基于程序變異的故障注入及故障規(guī)則庫(kù)的設(shè)計(jì)

徐麗 中國(guó)礦業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 221008

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

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

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

對(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è)試的覆蓋面。

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

從上面的例子中可以看出,基于斷言違背的軟件故障注入技術(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ī)制的目的。

1.3 逆向設(shè)置的軟件故障注入方法

本節(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ù)期的異常。

2.故障注入規(guī)則庫(kù)的設(shè)計(jì)與生成

本節(jié)特別有針對(duì)性的選擇了幾種常見(jiàn)的異常情況,對(duì)其進(jìn)行可發(fā)生故障的分析,特別對(duì)可能發(fā)生的故障設(shè)計(jì)了故障注入規(guī)則庫(kù),以確定原程序中的故障注入點(diǎn)以及故障注入的可選列表。

2.1 故障注入規(guī)則庫(kù)的設(shè)計(jì)

本小節(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è)可選擇的條件。

2.2 故障注入規(guī)則庫(kù)的生成與實(shí)現(xiàn)

我們根據(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.052

猜你喜歡
邊界值故障注入數(shù)組
模擬訓(xùn)練裝備故障注入系統(tǒng)研究
JAVA稀疏矩陣算法
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
如何設(shè)計(jì)好的測(cè)試用例
巧用洛必達(dá)法則速解函數(shù)邊界值例讀
讀寫算(2019年11期)2019-08-29 02:04:19
SM4算法前四輪約減輪故障注入分析
采用修改-回放原理的1553B故障注入方法
列車MVB總線故障注入研究
尋找勾股數(shù)組的歷程
一類帶有Dirichlet邊界值條件的橢圓型方程正解的存在性
昌邑市| 和静县| 宣恩县| 成都市| 铜鼓县| 股票| 咸阳市| 萍乡市| 岚皋县| 土默特右旗| 丁青县| 甘南县| 衡东县| 栾城县| 大同县| 兰溪市| 潜山县| 奉贤区| 宁河县| 安西县| 陵川县| 白银市| 荃湾区| 平安县| 会泽县| 临海市| 当雄县| 荆州市| 涿鹿县| 潢川县| 怀安县| 汉源县| 彰化市| 齐河县| 游戏| 邵阳市| 麻栗坡县| 永和县| 留坝县| 荥经县| 定安县|