Linux內核函數魯棒性關(guān)聯(lián)測試
軟件(或軟件構件)魯棒性是衡量軟件在異常輸入和應力環(huán)境條件下保持正常工作能力的一種度量。魯棒性測試主要用于測試操作系統、應用程序、COTS軟件、構件及服務(wù)協(xié)議等軟件和協(xié)議的可靠性及健壯性。在操作系統和安全關(guān)鍵軟件等一些重要軟件的測試上尤為重要。對于系統魯棒性的評價(jià)一般有基于測量的方法和基于故障注入的方法,近年來(lái)提出了魯棒性基準程序方法(Robustness Benchmarking)[1]。魯棒性基準程序(Robustness Benchmark)由一組健壯性測試用例組成。
實(shí)施軟件魯棒性測試的目的是發(fā)現所測代碼的健壯性薄弱環(huán)節,并予以消除或增強抵抗異常情況的能力。增強代碼健壯性的過(guò)程包括:(1)確定軟件的激發(fā)健壯性失效的異常值參數,并進(jìn)行測試;(2)分析測試結果,找出失效原因;(3)寫(xiě)保護代碼屏蔽導致失效的異常值;(4)把保護代碼與軟件模塊相連接[3]。
1 Linux內核函數測試
Linux操作系統體系結構從底層到頂部的順序依次是:內核(包含內核函數)、系統調用、內建程序(操作系統的命令)。內核函數是內核代碼的組成部分,其調用程序直接運行在內核空間。內核函數一旦出現異常,將立刻對整個(gè)操作系統產(chǎn)生影響。系統調用一般對內核函數進(jìn)行封裝,以此作為內核與用戶(hù)空間的接口。當用戶(hù)程序使用系統調用時(shí)會(huì )轉到內核空間,調用結束后又會(huì )返回用戶(hù)空間。內核函數的測試結果一般分類(lèi)為:函數錯誤碼返回、異常、內核掛起、工作負載夭折、工作負載結果不正確、工作負載完成[1]。
Linux內核函數魯棒性測試的最終目的是要提高系統的健壯性,需要根據測試結果生成相應的保護代碼。這方面的研究目前處于初期階段。
2 魯棒性維度分析
典型的魯棒性測試包括模塊化基準測試和層次化測試兩種主要方法。模塊化基準測試是對一個(gè)系統進(jìn)行分離測試。它把一個(gè)獨立的系統看作是一系列組件的集合,如文件系統、內存系統、外部交互系統、鎖機制和多道程序運作等,另外還通過(guò)一個(gè)監視器程序來(lái)監視和收集測試的結果。而層次化測試是通過(guò)定義一個(gè)清晰的交互層,使測試和對各種模塊進(jìn)行測試的執行細節相分離。一些測試可以適用于所有模塊,而另一些可能只適合一個(gè)模塊子集。使用層次性結構是分解系統的好方法。通過(guò)層次化來(lái)對操作系統進(jìn)行測試可以收到較好的效果[2]。
無(wú)論采用模塊化基準測試還是層次化方法,最終都是對操作系統接口函數采用參數的組合測試。對魯棒性測試結果進(jìn)行分析的一種方法是使用維度(Dimensionality)模型。維度有兩種定義:(1)參數維度,它指的是模塊中參數的個(gè)數,對于一個(gè)軟件模塊而言,參數維度被定義為其變量的個(gè)數;(2)魯棒性失效維度,對于引起魯棒性失效的一組特殊參數,那些確實(shí)引起失效的參數的個(gè)數被定義為魯棒性失效維數。
2.1 維度失效
維度失效分一維失效和多維失效。多維失效的參數一定都是符合條件的系統能夠識別的值。一維失效和多維失效所引發(fā)的原因不同,一維失效是參數非法,多維失效是參數組合非法(每個(gè)參數都是合法的)。當一維失效用例被保護和屏蔽后,會(huì )不會(huì )跳轉為多維失效,關(guān)鍵是看其參數是否構成組合關(guān)系。從對其參數的組合關(guān)系的判定上,可以判斷該失效用例是真維失效用例還是變維失效用例[3]。
基于低維度優(yōu)先的維度模型中失效維度不可能超過(guò)參數維度??赡軐儆谝痪S失效的某個(gè)失效,同時(shí)也可能屬于高維失效。對于這種情況,一般把這個(gè)失效作為低維失效來(lái)對待。同時(shí)激發(fā)軟件魯棒性失效所需考慮的最少因素取決于魯棒性失效維數,當參數維度為失效維度時(shí),測試結果的觀(guān)察最為直觀(guān);當參數維度大于失效維度,測試結果的觀(guān)察就不太直觀(guān)了。失效維度也可以通過(guò)觀(guān)察魯棒性測試的響應模式得到。
2.2 失效狀態(tài)分析
維度失效狀態(tài)分為三類(lèi)。(1)真維失效指狀態(tài)失效條件被屏蔽后,測試用例跳轉到正常狀態(tài);(2)同維失效指狀態(tài)失效條件被屏蔽后,失效維度保持不變;(3)變維失效指相同條件下產(chǎn)生失效維度升高。由于基于低維度優(yōu)先原則,所以由高維度向低維度的失效躍遷跳變不可能發(fā)生[3]。魯棒性測試用例的失效維度狀態(tài)轉變如圖1所示。
現以L(fǎng)inux系統函數read(fd, buf,count)為實(shí)例進(jìn)行分析,說(shuō)明上述不同失效維度之間的轉變問(wèn)題。函數的三個(gè)參數取值如表1所示。
假設當參數fd取值errno file,buf取值 Null時(shí),均會(huì )產(chǎn)生一維失效。當fd取合法的值,并且buf分配空間小于count時(shí)產(chǎn)生一個(gè)二維失效。此時(shí),對參數fd取值empty file進(jìn)行保護屏蔽,則一些測試用例將會(huì )通過(guò)測試,如read(empty file,8,1);而另一些用例則維持一維失效不變,如read(empty file,Null,1024);還有一些用例將轉化為多維(維度≥2)失效,如read(empty file,1,8)。
3 魯棒性關(guān)聯(lián)測試
當參數維度等于失效維度時(shí),很容易看出是哪些參數失效。而測試時(shí)維度的跳變,會(huì )給魯棒性測試的分析帶來(lái)困難,會(huì )影響測試覆蓋率的問(wèn)題,還牽扯到測試用例的增加[4]。在魯棒性測試中可以利用參數的關(guān)聯(lián)性進(jìn)行測試。將傳統的組合測試法分為兩步:關(guān)聯(lián)性測試和非關(guān)聯(lián)性測試。魯棒性關(guān)聯(lián)測試的流程如圖2所示。
在進(jìn)行魯棒性關(guān)聯(lián)測試時(shí),首先進(jìn)行參數關(guān)聯(lián)性測試,先把待測函數中有互相作用的參數進(jìn)行包裝,在測試中人為構造參數維度等于失效維度的情況。例如,函數f(A,B,C,D,E)中,參數A、B、C有關(guān)聯(lián)。首先將參數E和參數F取合法輸入值,然后測試參數A、B、C的所有組合。若有失效,必定是一維失效或者三維失效。由于參數維度等于失效維度,通過(guò)分析測試結果就可以寫(xiě)出保護代碼。在對函數進(jìn)行了充分的關(guān)聯(lián)測試后,再進(jìn)行參數非關(guān)聯(lián)性測試。取出上例中參數A、B、C的一個(gè)合法組合,對參數E和參數F的所有用例分別進(jìn)行測試。若有失效,必定是一維失效,這樣也很容易分析測試結果和寫(xiě)出保護代碼。
通過(guò)對函數的參數關(guān)聯(lián)性進(jìn)行測試可得出結論,只有當函數所有參數都發(fā)生關(guān)聯(lián)作用時(shí),魯棒性關(guān)聯(lián)測試所需用例的個(gè)數才會(huì )等于傳統組合測試所需的用例個(gè)數[5]。所以,在覆蓋率不變的情況下,若采用魯棒性關(guān)聯(lián)測試法,可以有效減少測試用例個(gè)數,并且還能夠消除維度失效跳變帶來(lái)的影響。
4 測試實(shí)例
實(shí)際測試中測試環(huán)境為DELL的DIMENSION 4700,操作系統為Redhat Linux 8.0,系統內核為2.2.24。實(shí)測以read()函數參數組合表為例,其表中組合測試用例的個(gè)數為5×5×5=125個(gè)。進(jìn)行關(guān)聯(lián)測試時(shí)先對其參數的關(guān)聯(lián)性進(jìn)行分析,通過(guò)分析可以得知它的三個(gè)參數中只有buf和count有關(guān)聯(lián)。
實(shí)測中首先進(jìn)行關(guān)聯(lián)性測試,對read()函數的參數fd取正常值,測試參數buf和count的所有組合,測試結果如表2所示。共使用了25個(gè)測試用例。
在對上述測試結果進(jìn)行屏蔽失效后,轉入第二步,對參數fd進(jìn)行非關(guān)聯(lián)性測試,即針對fd與(buf+count)的組合進(jìn)行測試。對buf與count的組合取合法值后,針對參數fd的所有取值分別測試,這時(shí)只會(huì )發(fā)生一維失效,測試用例個(gè)數是5個(gè),其結果如表3所示。
由上述測試實(shí)例可見(jiàn),傳統組合測試法需要125個(gè)用例,而關(guān)聯(lián)測試只需要30個(gè)用例,兩者最終完成的函數測試覆蓋率相同。由此可見(jiàn),關(guān)聯(lián)測試是對傳統的組合測試的一種有效改進(jìn)。傳統的參數組合測試忽略了參數之間的關(guān)系,結果導致測試用例大量增加,覆蓋率卻有可能降低,同時(shí)還由于產(chǎn)生了維度跳轉而給測試增加了困難[6]。采用關(guān)聯(lián)測試可以避免上述問(wèn)題的產(chǎn)生。使用關(guān)聯(lián)測試時(shí)對參數之間關(guān)系進(jìn)行分析,還有可能發(fā)現傳統的組合測試沒(méi)有測到的失效用例,這樣關(guān)聯(lián)測試的覆蓋率相對于傳統組合測試來(lái)說(shuō),只會(huì )提高而不會(huì )降低,這對于Linux內核函數的魯棒性提升十分有效。
理論分析和實(shí)例應用的結果表明,在Linux內核函數的魯棒性測試中采用關(guān)聯(lián)測試來(lái)代替傳統的組合測試,可以在保證測試覆蓋率的同時(shí),使所需的測試用例大大減少,而且函數中相關(guān)聯(lián)的參數個(gè)數越少優(yōu)勢越明顯?,F實(shí)中Linux內核函數的參數之間關(guān)聯(lián)性較少,因此在其魯棒性測試中關(guān)聯(lián)測試方法具有很好的實(shí)際應用價(jià)值。
評論