專利名稱:一種用于軟件測試的交叉式動態(tài)法和裝置的制作方法
技術領域:
本發(fā)明涉及軟件的測試方法,尤其涉及軟件的動態(tài)測試法。
背景技術:
軟件測試主要用于軟件正確性分析和軟件漏洞檢測,可分為靜態(tài)測試方式和動態(tài)測試方式。靜態(tài)測試指不運行被測程序,通過人工或借助專業(yè)軟件來對程序的靜態(tài)特性進行分析,通過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性。動態(tài)測試指實際運行被測程序,提供相應的測試數據,通過檢查軟件的動態(tài)行為或判斷運行結果的正確性來檢測軟件。動態(tài)測試方法避免了靜態(tài)測試方法人工開銷大、效率低、誤報率高等缺陷,成為了當前主流的軟件測試方式,動態(tài)測試常用的技術包括動態(tài)隨機測試和動態(tài)符號執(zhí)行。動態(tài)隨機測試方法能隨機產生大量的數據作為程序的輸入,動態(tài)運行程序,從而檢測程序漏洞。因其直接運行被測程序,不需了解內部結構細節(jié),也不需要額外的開銷,具有良好的擴展性,容易實現,所以被廣泛采用。然而,當輸入值是特定的字符或數字時,隨機測試要隨機產生該特定值的概率非常小(示例1詳細說明)。另一方面,對于較大應用程序, 隨機測試雖能迅速深入被測程序內部,但測試具有隨機性,只能覆蓋局部程序行為,從而不能保證測試的全面性、精確性。如圖1所示是針對隨機測試特點的模擬圖,帶箭頭的折線表示隨機測試的路徑,黑色方塊表示代碼塊,折線與方塊相交,表示該代碼塊被執(zhí)行到。由圖1 可看出,該方法測試能夠深入測試,但也具有隨機性、單一性,不能全面覆蓋周圍的代碼塊。 由于以上不可避免的原因,限制了隨機測試的擴展,使其在通常情況下僅被作為其它測試技術的輔助方法使用。動態(tài)符號測試技術通過多次執(zhí)行被測程序,并且自動產生使被測程序每次執(zhí)行不同路徑的輸入值,企圖測試到新的代碼塊。通過全路徑的搜索從而達到對整個程序路徑狀態(tài)空間的覆蓋,全面檢測被測程序。有以下幾個執(zhí)行步驟
1)將輸入數據映射為特定的符號,實際執(zhí)行程序,同時跟蹤輸入符號的執(zhí)行流程,用符號在路徑上的操作更新符號,并搜集符號在分支語句上的條件表達式。通過示例1(符號路徑約束條件表達式示例)簡單說明該過程
1.int test(int χ) {
2.χ=χ-1 ;
3.if (χ>0) {
4· …
5.} else {…}
6.}
在實際執(zhí)行過程中,調用test函數時會為χ變量提供確定的輸入值,但是在符號執(zhí)行時不用考慮這些確定輸入值,而是將χ變量映射為符號,如“inputO”;執(zhí)行到第2句時更新 χ變量對應的符號,形成表達式“inputO -1”;到第三句的if條件語句,根據“x>0”是否成立建立條件表達式,如果成立,則建立符號條件表達式為“ inputO _1>0”,且本次執(zhí)行路徑為1-2-3-4-6。反之,沿第5行的else語句執(zhí)行,條件表達式為“inputO -1 ^ 0”,執(zhí)行路徑為1-2-3-5-6。整體路徑上的條件表達式的連接與組成該路徑的路徑約束條件。如該示例路徑1-2-3-4-6對應的路徑約束條件為(inputO -1>0) Λ ξ ξ 為第4行內省略的約束條件。2)對某條路徑約束條件取反,通過后繼步驟的操作,預使下次執(zhí)行沿不同的路徑, 覆蓋到新的代碼塊。所謂取反就是將條件關系取反,如將“/=”取反得到“=”,將“〉”取反為“<=”。對示例1,假設if條件成立,則本次執(zhí)行路徑為1-2-3-4-6,那么第5行的代碼塊沒有被覆蓋至lj(執(zhí)行到)。如果將第3行將對應的約束條件條件取反為“inputO _1<0”,就可使下次沿 else分支執(zhí)行,從而覆蓋到新的代碼塊執(zhí)行。通過對分支語句的條件表達式取反,使每次執(zhí)行不同的分支路徑,企圖通過該方式覆蓋到新的代碼塊,是動態(tài)符號執(zhí)行最本質的特征。3)對取反的路徑約束條件用SMT求解器求解。如果有解,則產生一組實際值,該實際值作為新的輸入驅動下一次的符號執(zhí)行沿該預定的路徑執(zhí)行。這里說明一下,一條有解的路徑約束條件必定對應一條路徑,兩者是一一對應的關系。4)如此,直到被測程序的所有路徑被測試完成。整個測試狀態(tài)空間是一顆路徑二叉樹。如圖2所示是針對動態(tài)符號執(zhí)行特點的模擬圖。圖中黑色方塊代表代碼塊,同心圓代表動態(tài)符號執(zhí)行的測試范圍,因為動態(tài)符號執(zhí)行每次都能覆蓋鄰近的代碼塊的特征, 使其能夠全面的覆蓋被測程序,因此用同心圓表示執(zhí)行路線。符號執(zhí)行雖比隨機執(zhí)行有多余的開銷,但是符號執(zhí)行保證測試的精確性、全面性, 能達到更高的代碼覆蓋率,使其成為比隨機測試更有前景的軟件測試技術。但是,動態(tài)符號執(zhí)行有一個不能避免的缺陷,隨著被測程序的增大或者循環(huán)次數的增加,整條路徑的約束條件長度也線性的增加,每增加一條路徑約束條件,路徑二叉樹的高度加1,需要測試的路徑增加一倍。如此,隨著路徑長度的線性增長,需測路徑按2的冪級數增加,引起路徑爆炸, 在有限的時間資源條件下,不可能測試完成,并且路徑長度的增加也需要花費更多的求解器求解時間。受應用程序增大、對本地庫函數調用、循環(huán)次數不確定性等幾個因素影響,弓丨起的路徑爆炸問題,使動態(tài)符號執(zhí)行不能實際應用于主流大型軟件的測試,如Firefox, OpenOffice,MYSQL 等。
發(fā)明內容
針對上述現有技術,本發(fā)明要解決的技術問題是提供一種結合隨機測試和動態(tài)符號執(zhí)行的用于軟件測試的交叉式動態(tài)法和裝置,其能全面檢測較大應用程序,且能緩解動態(tài)符號執(zhí)行面臨的路徑爆炸問題。為了解決上述技術問題,本發(fā)明采用如下技術方案一種用于軟件測試的交叉動態(tài)法,包括如下步驟
(1)通過動態(tài)隨機測試法對被測程序執(zhí)行隨機檢測,檢測程序漏洞,如果檢測到程序異常則記錄異常信息退出測試,否則在本次執(zhí)行完后,計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和,如果飽和則調用符號切換函數,切換到動態(tài)符號執(zhí)行,將該父進程掛起,否則繼續(xù)進行下次測試,直到檢測到代碼覆蓋率飽和;
(2)通過動態(tài)符號執(zhí)行法搜索新的未被覆蓋代碼塊,如果有新的代碼塊被檢測到則將狀態(tài)還原到步驟(1)的隨機執(zhí)行狀態(tài),如果所有的基本塊都已被覆蓋,則退出測試。進一步地,所述代碼覆蓋率的計算方法為在測試之前使用一個IDA Pro的插件, 用于搜集靜態(tài)可執(zhí)行程序的所有基本塊,通過動態(tài)獲取的基本塊與靜態(tài)基本塊的比值得出當前的代碼覆蓋率。進一步地,所述動態(tài)符號執(zhí)行法包括如下步驟
①利用隨機測試法中的測試用例實際執(zhí)行被測程序同時動態(tài)符號執(zhí)行,搜集路徑約束條件;
②使用Generational算法對每條約束條件都取反,生成該路徑鄰近的所有路徑對應的路徑約束條件;
③用求解器對生成的每個路徑約束條件分別求解,生成測試用例集合;
④在測試用例集合中選擇新代碼塊增量最大的測試用例作為該模塊的返回值,如果本次符號執(zhí)行沒有新的代碼塊被檢測到,那么從測試用例集合中隨機選擇一個測試用例作為 ①的輸入驅動下一次的符號執(zhí)行,直到有新的未被覆蓋代碼塊被檢測到。一種用交叉動態(tài)法測試軟件的裝置,包括
隨機測試模塊,用于實現隨機檢測功能,并計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和;
動態(tài)符號執(zhí)行模塊,根據隨機測試模塊已測試的程序狀態(tài),利用動態(tài)符號執(zhí)行,探索新的未被覆蓋的代碼塊;
插樁模塊,用于對被測程序插樁,搜集隨機執(zhí)行和動態(tài)符號執(zhí)行覆蓋到的代碼塊信息, 同時在動態(tài)符號執(zhí)行時搜集路徑約束條件;
符號切換模塊,用快照方式保存被測程序的當前狀態(tài),并創(chuàng)建子進程執(zhí)行動態(tài)符號測試,父進程掛起等待子進程喚醒,子進程繼承了父進程的當前所有狀態(tài),保證從當前狀態(tài)繼續(xù)執(zhí)行;
隨機還原模塊,用動態(tài)符號執(zhí)行產生的,能覆蓋新代碼塊的測試用例更新父進程的輸入,喚醒父進程,子進程退出,從當前狀態(tài)繼續(xù)執(zhí)行隨機測試;
狀態(tài)檢測模塊,用于檢測隨機測試模塊執(zhí)行是否達到飽和,從而調用符號切換模塊,準備切換到動態(tài)符號執(zhí)行模塊執(zhí)行;同時檢測動態(tài)符號執(zhí)行是否檢測到新的代碼塊,從而調用隨機還原模塊,準備還原到隨機測試模塊。進一步地,所述插樁模塊采用PIN工具。與現有技術相比,本發(fā)明具有以下有益效果
本方案提出的交叉式動態(tài)符號執(zhí)行方案,是隨機測試和動態(tài)符號執(zhí)行兩種技術的結合。開始執(zhí)行隨機測試,當覆蓋率達到飽和時(代碼覆蓋率增量為零),通過符號切換模塊保存當前的程序狀態(tài),切換到動態(tài)符號執(zhí)行,利用動態(tài)符號執(zhí)行檢測新代碼塊,當有新代碼塊檢測到時,通過隨機還原模塊又重新切換到隨機測試。如此,利用隨機測試和動態(tài)符號測試交叉執(zhí)行,利用它們之間的互補關系彌補各自的缺陷,避免隨機測試因需生成某一特定值
5而陷入,避免動態(tài)符號執(zhí)行因循環(huán)而陷入。使該測試方案具有隨機測試開銷小、速度快的特點,又有動態(tài)符號執(zhí)行全面性、精確性的特點。能達到比兩者并行執(zhí)行更高的代碼覆蓋率, 并且能大幅度緩解路徑爆炸,具有更好的測試性能。
圖1為動態(tài)隨機測試模擬圖; 圖2為動態(tài)符號執(zhí)行模擬圖; 圖3為交叉式動態(tài)符號執(zhí)行模擬圖; 圖4為本發(fā)明實施例交叉式動態(tài)法執(zhí)行裝置圖。
具體實施例方式
下面將結合附圖及具體實施方式
對本發(fā)明作進一步的描述。交叉式動態(tài)符號法執(zhí)行的模擬圖如圖3所示,通過對三種技術的模擬圖(圖1,圖 2,圖3)的比較也可以看出混合式符號執(zhí)行的優(yōu)勢。圖3代表的交叉式動態(tài)符號執(zhí)行利用隨機測試可以快速深入程序內部(折線所示),利用動態(tài)符號執(zhí)行能夠覆蓋鄰近的代碼塊(同心圓所示),與圖1,圖2相比,明顯能覆蓋更多的代碼塊(黑色方塊所示)。下面通過示例2 (混合式動態(tài)符號測試算法)對以上三種技術作簡單的說明及比較
1.void testme () {
2.char * s, c ;
3.int state = 0;
4.s = input 0 ;
5.while (1) {
6.c = input 0 ;
7.if (c == , [, && state == 0) state = 1;
8.if (c == , (, && state == 1) state = 2;
9.if (c == , {, && state == 2) state = 3;
10.if (c == , ” && state == 3) state = 4;
11.if (c ==,a' SlSl state == 4) state = 5 ;
12.if (c ==,x' SlSl state == 5) state = 6;
13.if (c == , }, && state == 6) state = 7;
14.if (c == , ), && state == 7) state = 8;
15.if (c == , ], && state == 8) state = 9;
16.if (s
==,r' && s[l] ==,e,&& s[2] ==,s,&& s[3] ==,e,&&
17.s[4] ==,t,&& s[5] == 0&& state == 9) {
18.ERROR;
19.}}}
示例2中,循環(huán)每次接受兩個輸入s、c,s為字符串,c為字符。如果變量state達到9, 并且字符串s為“reset”,則觸發(fā)錯誤態(tài)ERROR,該示例的目的就是要檢測出ERROR狀態(tài)。
如果使用隨機測試方式,經過可能幾百或幾千次循環(huán)(這樣的開銷對當前的計算機執(zhí)行能力來說并不算大),很容易滿足7 15行的if條件,使state的值達到9,但是使s 的值為“reset”的概率為1/28*5 (5個字符,每個字符長度為8bit,s[5]為字符串結束符), 如此,隨機測試要擊中ERROR的概率非常小,實際不可行。如果使用動態(tài)符號執(zhí)行方法,由于對路徑約束條件取反,驅使每次執(zhí)行不同的分支路徑,所以能用很少的執(zhí)行次數(1/26以內)使s的值變成“reset”,驅第16-17行的if 語句條件成立。但是,對于該示例的無限循環(huán)算法,每次循環(huán)產生16條約束條件,至少需要 9次循環(huán)才能是state的值為9,一次執(zhí)行的路徑約束條件長度為16*9,需要測試的路徑數量為21W9,更不可能在有限的時間資源條件下觸發(fā)ERROR。而本方案實現的交叉式動態(tài)符號執(zhí)行技術,結合以上兩種方法的優(yōu)勢,對疒15 行使用隨機測試,快速使state值為9 ;對第16-17行使用動態(tài)符號執(zhí)行產生字符串 S=“reSet”,利用隨機測試技術和動態(tài)符號測試技術,使整個測試能在很小的時間開銷內觸發(fā) ERROR。參見圖4,一種用交叉動態(tài)法測試軟件的裝置,包括 1.隨機測試模塊
該模塊的功能是通過產生隨機值,實際執(zhí)行被測程序,檢測程序漏洞,不需要其他額外的操作。本方案利用現有的Fuzzing測試技術來實現該模塊的功能。Fuzzing測試,即模糊測試,是一種基于缺陷注入的自動軟件測試技術,它利用黑盒測試的思想,使用大量半有效的隨機數據作為應用程序的輸入,以程序是否出現異常為標志,來發(fā)現應用程序中可能存在的安全漏洞。特定類型的應用程序或者協(xié)議有不同的Fuzzing工具,如針對瀏覽器的 mangleme、針對文件應用程序的 FileFuzzing 和 SPIKE-file、針對 ActiveX 的 COMRaider 和 AxMaru針對網絡協(xié)議的SPIKE等。在本方案中根據被測軟件類型來選擇不同的工具。該模塊的具體執(zhí)行流程如下
1)分析被測程序類型,選擇一款Fuzzing工具,轉到2);
2)利用Fuzzing工具產生隨機值,形成輸入測試用例,轉到3);
3)對被測程序插樁,將輸入測試用例作為輸入運行程序,監(jiān)視程序的運行狀態(tài),并且保存該路徑覆蓋的代碼塊。如果檢測到程序異常則轉到6),否則轉到4);
4)本次執(zhí)行完后,計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和。如果達到則轉到 5),否則轉到2)繼續(xù)進行下次測試;
5)調用符號切換函數,準備切換到符號執(zhí)行,該進場將被掛起。6)記錄異常信息,包括異常的地址、觸發(fā)異常的測試用例。轉到7); 7)退出測試。2.動態(tài)符號執(zhí)行模塊
該模塊的功能是利用動態(tài)符號執(zhí)行來搜索新的未被覆蓋代碼塊。該模塊的輸入是當前測試的程序狀態(tài),包括已測試路徑、已覆蓋基本塊。為達到高效的新代碼塊查找功能,該模塊沒有利用現用的動態(tài)符號執(zhí)行工具,而是自己實現的一套動態(tài)符號執(zhí)行方案,具體執(zhí)行流程如下
1)利用當前的測試用例實際執(zhí)行被測程序同時符號執(zhí)行,搜集路徑約束條件。例如示例3是對示例2符號執(zhí)行搜集到的路徑約束條件的部分表內容。
(/= (CMP8 input6 91)) (/= (CMP8 input6 40))
(/= (CMP8 input6 123)) (/= (CMP8 input6 63)) (/= (CMP8 input6 97)) (/= (CMP8 input6 120)) (/= (CMP8 input6 125)) (/= (CMP8 input6 41)) (/= (CMP8 input6 93))
(/= (CMP8 (EXT0_7 (CAT8_24 input4 (CAT8_16 input3 (CAT8_8 input2 input1)))) 114))
示例1路徑約束條件表達式
其中丨即肚6是字符(對應的符號,91,40等值是‘[’、‘(’等字符對應的ASCII碼值。該格式是由PIN執(zhí)行(插樁模塊說明)的輸出格式。將第一條轉換成易理解的格式為 "input6/= 91”。2)使用Generational算法對每條約束條件都取反,生成該路徑鄰近的所有路徑對應的路徑約束條件。Generational算法是微軟資深軟件測試工程師I^atrice Godfroid 提出的一種動態(tài)符號測試算法。該算法將路徑約束條件中的每一條路徑都取反,從而生成一堆測試用例,從中選擇能覆蓋最多代碼塊的測試用例驅動下次符號執(zhí)行。3)用求解器對生成的每個路徑約束條件分別求解,生成測試用例集合。這里說明一下,動態(tài)符號執(zhí)行搜集到的路徑約束條件都是SMT問題,而求解器就是用來求解這些問題是否可滿足的,并給出一組可滿足值。例如,表達式x-y>0,是可滿足的,可給出滿足該公式的一組值(2,1) ;x2+y2<0是不可滿足的,不能給出一組(、,I1)值,使該表達式成立。常見的SMT求解器有STP,CVC, OpenSMT, Yices, Z3等,在本模塊中選擇STP作為SMT的求解器。4)在測試用例集合中選擇新代碼塊增量最大的測試用例作為該模塊的返回值。如果本次符號執(zhí)行沒有新的代碼塊被檢測到,那么從測試用例集合中隨機選擇一個測試用例作為1)的輸入驅動下一次的符號執(zhí)行,直到有新的代碼塊被檢測到。3.插樁模塊
該模塊的功能是對運行時的被測程序進行動態(tài)二進制插樁,記錄已被測試到的代碼塊,并在符號執(zhí)行時搜集路徑約束條件。對動態(tài)程序插樁是動態(tài)符號執(zhí)行的一項基本且不可或缺的措施?,F有的二進制插樁工具有ATOM、Dynins、Valgrind、PIN、Nirvana、HDTrans 等,在本方案中采用PIN作為插樁工具。PIN是一款開源的動態(tài)插樁工具,支持IA-32, Intel (R) 64, IA-64指令結構,可用于Windows OS和Linux系列操作系統(tǒng)平臺上,PIN可以將任意代碼植入處于運行態(tài)程序的任意位置,跟蹤指令流程,并記錄寄存器、內存的數據信息。另外,本方案在測試之前還使用了一個IDA Pro的插件,用來搜集靜態(tài)可執(zhí)行程序的所有基本塊。通過動態(tài)獲取的基本塊與靜態(tài)基本塊的比值可以得出當前的代碼覆蓋率。在動態(tài)符號執(zhí)行時,通過對被測程序插樁,可以監(jiān)測符號的流動路徑、操作運算, 從而收集路徑約束條件。
4.狀態(tài)檢測模塊
本模塊有兩個功能,一是檢測隨機執(zhí)行是否達到飽和,即代碼覆蓋率不再增加,從而調用符號切換模塊,準備切換到動態(tài)符號執(zhí)行模塊執(zhí)行。該部分功能的實現是在每次隨機測試后都檢測當前的代碼覆蓋率增量。若在一定界限內(本示例設置為50)該增量為0,說明當前隨機測試因特定值的選取而陷入,使代碼覆蓋率達到飽和,需要使用動態(tài)符號執(zhí)行來破解該陷入,探索新的代碼塊。另一功能是檢測動態(tài)符號執(zhí)行是否檢測到新的代碼塊,從而調用隨機還原模塊, 準備還原到隨機測試模塊。如果動態(tài)符號執(zhí)行檢測到新的代碼塊,則代碼覆蓋率必定有所增加,根據該增量標志,使動態(tài)符號執(zhí)行退出,切換到隨機測試模塊繼續(xù)運行。該模塊的輸入是一個布爾值的轉換標識符translate,當該值為false時切換到符號執(zhí)行模塊,值為true時切換到隨機測試模塊。5.符號切換模塊
該模塊的功能是從隨機測試切換到符號執(zhí)行。使用如虛擬機的快照方式保存當前的測試狀態(tài)(如已執(zhí)行的路徑、已覆蓋代碼塊等),并創(chuàng)建動態(tài)符號執(zhí)行子進程,且將當前父進程掛起。子進程繼承父進程的所有資源,所以在動態(tài)符號執(zhí)行時不會重復執(zhí)行已被測試的路徑。6.隨機還原模塊
該模塊的功能是從動態(tài)符號執(zhí)行模塊還原到隨機測試模塊。該模塊是在動態(tài)符號執(zhí)行檢測到新的代碼塊后,退出動態(tài)符號執(zhí)行子進程,且將隨機測試父進程喚醒。并用動態(tài)符號子進程產生的新的測試用例更新原來的測試用例,使隨機測試模塊跳出原來的陷入狀態(tài), 從不同的代碼塊繼續(xù)執(zhí)行。下面簡單的給出了本發(fā)明的實現步驟
1)對被測程序執(zhí)行隨機檢測,并計算代碼覆蓋率。如果代碼覆蓋率的增量為0),即代碼覆蓋率達到飽和,則轉到2),否則繼續(xù)1)的隨機檢測。2)保存當前的檢測狀態(tài)(已檢測的路徑、已覆蓋的代碼塊等),創(chuàng)建動態(tài)符號執(zhí)行子進程。3)動態(tài)符號執(zhí)行被測程序,探索新的代碼塊,如果有新的代碼塊被檢測到,則轉到 4),如果所有的基本塊都已被覆蓋,則轉到5)退出測試,否則繼續(xù)3)的符號執(zhí)行。4)狀態(tài)還原到隨機執(zhí)行狀態(tài),并將當前的測試用例更替父進程的測試用例,喚醒父進程,退出當前子進程,轉到1)。5)結束。其中各個模塊之間的銜接并沒有明顯的分割,如隨機還原模塊完成后是回到了隨機模塊的第幻步,利用新的測試用例繼續(xù)執(zhí)行,狀態(tài)檢測模塊是在隨機測試模塊和動態(tài)符號執(zhí)行模塊的內部展現其功能的。本發(fā)明結合隨機測試的快速性、低開銷以及符號執(zhí)行的全面性、探索新代碼塊的特性,避免了隨機測試因需取特定值時面臨的小概率性、不確定性以及動態(tài)符號執(zhí)行因程序較大或循環(huán)引起的路徑爆炸問題,從而能夠更全面、更快速的測試軟件,并且與完全的動態(tài)符號執(zhí)行相比大大降低了軟件測試的開銷。能夠全面檢測較大應用程序,能夠緩解動態(tài)符號執(zhí)行面臨的路徑爆炸問題。
權利要求
1.一種用于軟件測試的交叉動態(tài)法,其特征在于,包括如下步驟(1)通過動態(tài)隨機測試法對被測程序執(zhí)行隨機檢測,檢測程序漏洞,如果檢測到程序異常則記錄異常信息退出測試,否則在本次執(zhí)行完后,計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和,如果飽和則調用符號切換函數,切換到動態(tài)符號執(zhí)行,將該父進程掛起,否則繼續(xù)進行下次測試,直到檢測到代碼覆蓋率飽和;(2)通過動態(tài)符號執(zhí)行法搜索新的未被覆蓋代碼塊,如果有新的代碼塊被檢測到則將狀態(tài)還原到步驟(1)的隨機執(zhí)行狀態(tài),如果所有的基本塊都已被覆蓋,則退出測試。
2.根據權利要求1所述的用于軟件測試的交叉動態(tài)法,其特征在于,所述代碼覆蓋率的計算方法為在測試之前使用一個IDA Pro的插件,用于搜集靜態(tài)可執(zhí)行程序的所有基本塊,通過動態(tài)獲取的基本塊與靜態(tài)基本塊的比值得出當前的代碼覆蓋率。
3.根據權利要求1或2所述的用于軟件測試的交叉動態(tài)法,其特征在于,所述動態(tài)符號執(zhí)行法包括如下步驟①利用隨機測試法中的測試用例實際執(zhí)行被測程序同時動態(tài)符號執(zhí)行,搜集路徑約束條件;②使用Generational算法對每條約束條件都取反,生成該路徑鄰近的所有路徑對應的路徑約束條件;③用求解器對生成的每個路徑約束條件分別求解,生成測試用例集合;④在測試用例集合中選擇新代碼塊增量最大的測試用例作為該模塊的返回值,如果本次符號執(zhí)行沒有新的代碼塊被檢測到,那么從測試用例集合中隨機選擇一個測試用例作為 ①的輸入驅動下一次的符號執(zhí)行,直到有新的未被覆蓋代碼塊被檢測到。
4.一種用交叉動態(tài)法測試軟件的裝置,其特征在于,包括隨機測試模塊,用于實現隨機檢測功能,并計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和;動態(tài)符號執(zhí)行模塊,根據隨機測試模塊已測試的程序狀態(tài),利用動態(tài)符號執(zhí)行,探索新的未被覆蓋的代碼塊;插樁模塊,用于對被測程序插樁,搜集隨機執(zhí)行和動態(tài)符號執(zhí)行覆蓋到的代碼塊信息, 同時在動態(tài)符號執(zhí)行時搜集路徑約束條件;符號切換模塊,用快照方式保存被測程序的當前狀態(tài),并創(chuàng)建子進程執(zhí)行動態(tài)符號測試,父進程掛起等待子進程喚醒,子進程繼承了父進程的當前所有狀態(tài),保證從當前狀態(tài)繼續(xù)執(zhí)行;隨機還原模塊,用動態(tài)符號執(zhí)行產生的,能覆蓋新代碼塊的測試用例更新父進程的輸入,喚醒父進程,子進程退出,從當前狀態(tài)繼續(xù)執(zhí)行隨機測試;狀態(tài)檢測模塊,用于檢測隨機測試模塊執(zhí)行是否達到飽和,從而調用符號切換模塊,準備切換到動態(tài)符號執(zhí)行模塊執(zhí)行;同時檢測動態(tài)符號執(zhí)行是否檢測到新的代碼塊,從而調用隨機還原模塊,準備還原到隨機測試模塊。
5.根據權利要求4所述的用交叉動態(tài)法測試軟件的裝置,其特征在于所述插樁模塊采用PIN工具。
全文摘要
本發(fā)明公開了一種用于軟件測試的交叉式動態(tài)法和裝置,其中,用于軟件測試的交叉動態(tài)法,包括如下步驟①通過動態(tài)隨機測試法對被測程序執(zhí)行隨機檢測,檢測程序漏洞,如果檢測到程序異常則記錄異常信息退出測試,否則在本次執(zhí)行完后,計算代碼覆蓋率,檢查代碼覆蓋率是否達到飽和,如果飽和則調用符號切換函數,切換到動態(tài)符號執(zhí)行,將該父進程掛起,否則繼續(xù)進行下次測試,直到檢測到代碼覆蓋率飽和;②通過動態(tài)符號執(zhí)行法搜索新的未被覆蓋代碼塊,如果有新的代碼塊被檢測到則將狀態(tài)還原到步驟①的隨機執(zhí)行狀態(tài),如果所有的基本塊都已被覆蓋,則退出測試。本發(fā)明能全面檢測較大應用程序,達到較高的代碼覆蓋率,緩解動態(tài)符號執(zhí)行路徑爆炸的問題。
文檔編號G06F11/36GK102508780SQ201110371268
公開日2012年6月20日 申請日期2011年11月21日 優(yōu)先權日2011年11月21日
發(fā)明者吉小麗, 張小松, 朱聰, 王玉超, 陳廳 申請人:電子科技大學