摘要:為了解決在大規(guī)模軟件測試中,人工的軟件測試費時費力而且測試效果差的問題,該文提出了一種基于模糊測試技術(shù)和路徑覆蓋分析方法的軟件測試方法。該測試方法可以自動完成用例生成、用例運行、收集目標(biāo)程序信息和計算可疑語句的可疑度。通過實驗,該方法在不降低代碼覆蓋率和錯誤發(fā)現(xiàn)率的情況下,縮短了軟件測試的時間。
關(guān)鍵詞:自動化軟件測試;模糊測試;錯誤定位
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2014)06-1231-04
計算機的應(yīng)用越來越多地深入到人們的日常生活中,然而計算機軟件還遠沒有達到零錯誤的要求。提高軟件質(zhì)量已經(jīng)成為軟件工程領(lǐng)域亟待解決的重要問題。軟件測試,作為一種提高軟件質(zhì)量的重要手段而備受重視。在軟件的開發(fā)生命周期中,軟件測試是一個耗時耗力的過程,已成為軟件開發(fā)的瓶頸之一[1]。據(jù)統(tǒng)計,軟件測試約占軟件開發(fā)和維護成本的50%~75%[2],因此,改進和改善軟件測試技術(shù)變得十分迫切與重要。模糊測試[3]是一種通過提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的技術(shù)。模糊測試一般是一個自動或半自動的過程,這個過程包括反復(fù)操縱目標(biāo)軟件并為其提供處理數(shù)據(jù)。近年來,有很多學(xué)者在不同類型軟件的軟件測試中都證實了模糊測試技術(shù)的有效性和自動化的特點。模糊測試技術(shù)針對不同類型的測試環(huán)境有不同的測試策略。例如,張等人[4]提出了一種針對網(wǎng)絡(luò)協(xié)議及模糊測試框架。沈等人[5]提出了一種基于文件規(guī)范描述的文件模糊測試算法,有效避免“無效”測試用例的生成,提高效率同時也增加了測試的全面性。
上面提到的模糊測試的研究重點主要集中在模糊器的設(shè)計與實現(xiàn)上,幾乎沒有涉及到錯誤定位的技術(shù)?;陬l譜的錯誤定位方法是基于實際執(zhí)行的動態(tài)錯誤定位技術(shù)的具體應(yīng)用。Harrold等人證實了程序頻譜與程序行為之間的關(guān)系,論證了通過研究運行失敗測試用例得到的頻譜信息與運行成功測試用例得到的頻譜信息之間的差異性可為定位出錯語句提供幫助[6]。該文調(diào)研了模糊測試技術(shù)和自動化錯誤定位技術(shù)的研究進展;第2節(jié)論述了自動化錯誤挖掘與定位技術(shù)可行性,并解釋本文技術(shù)的動機;第3節(jié)介紹自動化錯誤挖掘與定位技術(shù)的實現(xiàn)方法;模型的實現(xiàn)將在第4節(jié)給出;第5節(jié)總結(jié)并展望未來的研究方向。
1 研究動機
在軟件的生命周期中,軟件的維護成本所占比例特別大,所以一個好的軟件測試方法是非常必要的。一種優(yōu)秀的測試方法可以發(fā)現(xiàn)軟件中存在的大部分漏洞,從而可以降低軟件的維護成本,提高軟件的質(zhì)量。模糊測試是1989年由Bartoon Miller教授首先提出的,并通過模糊測試在UNIX存在的大量漏洞。在1999年Oulu大學(xué)開發(fā)PROTOS測試集,這標(biāo)志著模糊測試發(fā)展歷程的一個重要里程碑。2002年P(guān)ROTOS開始成熟,在2004年文件模糊測試開始興起,AxtiveX模糊測試在2006年開始流行。到目前為止模糊測試取得了一定的發(fā)展,已經(jīng)是軟件漏洞挖掘中不可或缺的技術(shù),但是這項技術(shù)仍然不是特別成熟[3]。圖1給出了模糊測試的過程。
軟件錯誤定位技術(shù)是通過運行測試用例得到程序的各條語句被測試用例覆蓋的信息,然后利用覆蓋信息計算出程序中語句的出錯可疑度[7]。在實際的測試過程中,有很多情況是測試用例導(dǎo)致程序的崩潰,程序崩潰時寄存器中的信息也是非常重要的。所以利用程序的覆蓋信息與程序崩潰是寄存器存儲的信息共同來定位程序的出錯信息可以提高定位的精度和速度。利用GCC中的GCOV命令可以收集C程序的運行的詳細(xì)信息,包括覆蓋率、代碼的執(zhí)行路徑、程序的執(zhí)行結(jié)果等信息。利用GDB調(diào)試器可以查看程序運行時CPU寄存器的狀態(tài)。
隨著計算機的不斷發(fā)展,程序的代碼越來越龐大,基于源代碼審核的白盒測試需要大量的人力和時間,這會大大增加軟件開發(fā)的成本。軟件測試的自動化是未來軟件測試發(fā)展的主要方向,通過把模糊測試技術(shù)和軟件錯誤定位技術(shù)結(jié)合起來,可以實現(xiàn)軟件測試的自動化,提高軟件維護的效率。
2 自動化錯誤挖掘與定位技術(shù)
在這一節(jié)將介紹自動化錯誤挖掘與定位技術(shù)的總體結(jié)構(gòu),以及對結(jié)構(gòu)中各主要模塊的功能與實現(xiàn)。
2.1 自動化錯誤挖掘與定位技術(shù)的總體結(jié)構(gòu)
為了實現(xiàn)軟件測試的自動化,所提出的解決方案由一下幾個模塊組成:模糊器模塊,測試結(jié)果記錄模塊,錯誤位置分析模塊。圖2為自動化錯誤挖掘與定位技術(shù)的流程圖。
圖2 自動化錯誤挖掘與定位技術(shù)的流程圖
2.2 模糊器模塊
模糊器模塊的主要作用是生成測試用例,并把測試用例提交給被測軟件,是模糊測試的核心結(jié)構(gòu)。模糊測試可分為兩類[8]:基于變異的模糊測試和基于生成的模糊測試。對于不同的測試目標(biāo)有不同的模糊器,其中主要的分類有:
1) 環(huán)境變量和參數(shù)。測試對象主要是命令行參數(shù)和環(huán)境變量,主要的模糊器是iFuzz。
2) Web應(yīng)用程序和服務(wù)器。針對Web服務(wù)器的存在漏洞的模糊器有Dave Aitel開發(fā)的SPIKE和WebScarab。
3) 文件格式。針對特定的文件格式,用于挖掘客戶端文件解析漏洞,主要的模糊器有notSPIKEfile、SPIKEfile和FileFuzz。
4) 網(wǎng)絡(luò)協(xié)議。通過特定的Socket形式將變異或者含有錯誤的數(shù)據(jù)包發(fā)送給目標(biāo)程序,相應(yīng)的模糊器有SPIKE和ProtoFuzz。
此外對于特定的測試目標(biāo),我們也可以手動構(gòu)造模糊器,在構(gòu)造模糊器時要充分考慮程序中可能存在的問題,例如:拒絕服務(wù)、整數(shù)處理問題、簡單的棧和堆溢出、格式化字符串和目錄遍歷等。對于不同的問題確定模糊器不同的用例生成規(guī)約。例如,對于整數(shù)處理問題,我們可以設(shè)計這樣的用例規(guī)約:生成邊界值附近的測試用例0,-1,1,2,3,0XFFFFFFFF-1,0XFFFFFFFF-2等測試用例。此外,我們還可以直接在網(wǎng)上下載有用的工具和庫,具體請查看文獻[12]。
2.3 測試結(jié)果記錄模塊
我們的目標(biāo)是實現(xiàn)軟件測試的自動化,所以就不能依賴人工識別錯誤。為了實現(xiàn)這個目標(biāo),我們需要一種可靠的,可編程的方法。有一種方法是檢查程序的返回代碼[9],在現(xiàn)在的UNIX和Linux系統(tǒng)中,如果一個應(yīng)用程序因為一個為處理的信號而中止,那么Shell的返回代碼將等于128加上該信號數(shù)字??梢岳眠@個值來判斷不同的錯誤。還有就是把應(yīng)用程序連接到調(diào)試器,錯誤處理機制將阻止由模糊測試所導(dǎo)致的許多錯誤的明顯標(biāo)記,但是這些錯誤一般可以通過使用一個調(diào)試器來發(fā)現(xiàn)。在Linux操作系統(tǒng)中,GDB就是一個特別好的調(diào)試器,一般來說,GDB主要幫助你完成下面四個方面的功能:1)啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序;2)可讓被調(diào)試的程序在你所指定的調(diào)置的斷點處停?。?)當(dāng)程序被停住時,可以檢查此時你的程序中所發(fā)生的事;4)動態(tài)的改變你程序的執(zhí)行環(huán)境。對于有些應(yīng)用程序,我們也可以通過見識其運行日志帶識別程序的運行結(jié)果。
測試用例執(zhí)行路徑是用于錯誤定位分析的主要數(shù)據(jù),檢測程序的主要方法是在程序的源代碼中進行插樁,根據(jù)程序的執(zhí)行結(jié)果來得到一個測試用例的執(zhí)行路徑。但是這種方法是基于語句的,在前期對源代碼的處理中費時費力,效率低下。在這里提出了一種新的插樁策略,在程序運行的時候,有很多語句塊只要語句塊的第一條指令被執(zhí)行,其后面的所有語句都會被執(zhí)行,把這樣的代碼塊稱為基本塊。在插樁時以基本塊為單位,這樣可以減少前期的準(zhǔn)備工作,又可以提高程序的運行效率。
對于每個測試用例的結(jié)果都進行保存,用于最后的定位分析。我們把用例執(zhí)行的相關(guān)信息保存到數(shù)據(jù)庫中,其中數(shù)據(jù)庫有三個標(biāo),分別用為:
1) 代碼表(codes),用來存儲程序的源代碼;
2) 用例執(zhí)行信息表(info),用來存儲用例執(zhí)行的各種信息,主要用,測試用例、執(zhí)行路徑、執(zhí)行結(jié)果等;
3) 異常表(abnormal),存儲導(dǎo)致程序出現(xiàn)異常時CUP各寄存器以及堆棧中的信息。
下面是記錄模塊的結(jié)構(gòu)圖。
圖3 記錄模塊結(jié)構(gòu)圖
2.4 錯誤位置分析模塊
錯誤位置分析模塊的功能是根據(jù)數(shù)據(jù)庫中的測試數(shù)據(jù)計算可能出錯或存在漏洞的語句。因為數(shù)據(jù)庫中記錄了每條測試用例的執(zhí)行路徑和執(zhí)行結(jié)果??梢岳脭?shù)據(jù)庫強大的數(shù)據(jù)處理能力,計算出錯路徑中每條語句的可疑度,其計算公式如公式(1):
[RESULTi(s)=TFi(s)TFi(s)+TP(s)] (1)
其中,TFi(S)經(jīng)過語句S出錯(錯誤類型為i)的測試用例個數(shù),TP(S)是正常經(jīng)過語句S的測試用例數(shù)。最后得到的結(jié)果為一系列語句可疑度的列表,其中可疑度最大的,出錯的可能性也最大。
3 模型實現(xiàn)與實驗
實驗?zāi)P褪墙⒃趗buntu 13.04 操作系統(tǒng)上,應(yīng)用的開發(fā)語言是Python 2.7.4,數(shù)據(jù)庫是Mysql Server 5.5.31。在實驗?zāi)P椭兄饕玫降能浖蠫Cov 4.7.3和GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu。GCov用于收集用例執(zhí)行路徑,Gdb用于查看測試軟件的執(zhí)行細(xì)節(jié)。實驗用的目標(biāo)程序是從SIR[10](http://sir.unl.edu)網(wǎng)站上下載的grep。實驗中數(shù)據(jù)庫表結(jié)構(gòu)如下表。
表1 目標(biāo)程序代碼表
表2 用例執(zhí)行路徑表
表3 用例執(zhí)行路徑表
通過簡單的模擬實驗,驗證了該方法在軟件測試中代碼覆蓋率、漏洞定位準(zhǔn)確性有明顯的提高,并且為發(fā)現(xiàn)的漏洞提供了相應(yīng)的信息。并且在整個軟件測試過程中,需要人干預(yù)的地方很少,基本實現(xiàn)了從用例生成、錯誤檢測和錯誤定位的自動化。
4 總結(jié)與展望
本文中提到的軟件測試方法實現(xiàn)了軟件測試中用例生成、測試與錯誤定位分析的自動化,提高了軟件測試的效率,加快了軟件開發(fā)的周期,降低了軟件維護的成本。同時該方法也存在一定的局限性,不能測試出軟件中存在的邏輯錯誤,也不能能驗證軟件功能的完整,只對軟件中存在其他錯誤(非法引用、堆棧溢出、格式化字符串等)有效。
在以后的研究中,應(yīng)探索新的軟件錯誤定位的方法和技術(shù)??梢詮囊幌聨讉€方面展開研究:
1) 利用動態(tài)的二進制插樁。在軟件測試中,有很多錯誤不能直接被發(fā)現(xiàn),例如:函數(shù)的堆棧溢出,如果溢出只是覆蓋了函數(shù)中的一些變量,沒有覆蓋函數(shù)的返回地址,即EIP的值。這種情況程序是不會報錯的,根據(jù)程序的運行結(jié)果很難定位錯誤。所以利用動態(tài)二進制插樁來實時監(jiān)控程序的運行狀態(tài)是一個不錯的研究方向。
2) 利用人工只能,實現(xiàn)軟件錯誤定位與自動修復(fù)。隨著計算機技術(shù)的發(fā)展,軟件規(guī)模越來越大,Binkley 估計到 2025 年人們開發(fā)的代碼將達到萬億行[11]。面對數(shù)量龐大的代碼,數(shù)據(jù)挖掘、機器學(xué)習(xí)等人工智能技術(shù)將會在故障定位方面得到很好的應(yīng)用。
參考文獻:
[1] Zhang Yu-Qian,Zheng Zheng,Ji Xiao-Hui. Markov Mpdel-Based Effectiveness Predicting for Software Fault Location[J].Chinese Journal of Computer, 2013,36(2):445-448.
[2] Yu Kai,Lin Meng-Xiang.Advances in automatic fault localization techniques.Chinese Journal of Computer,2011,34(8):1411-1422.
[3] Sutton M,Amini A G P.Fuzzing: Brute Force Vulnerability Discovery[M]. 黃隴,于莉莉,李虎,譯.北京:機械工業(yè)出版社,2009:13-20.
[4] 張寶峰,張翀斌,許源.基于模糊測試的網(wǎng)絡(luò)協(xié)議漏洞挖掘[J].清華大學(xué)學(xué)報:自然科學(xué)版,2009,49(S2):2113-2118.
[5] 沈亞楠,趙榮彩,王小芹,等.基于規(guī)范生成的文件模糊測試[J].計算機工程與設(shè)計,2010,31(16):3591-3594.
[6] Harrol M J,Rothermel G,Wu R,Yi L.An empirical investigation of program spectra[C].Proceedings of the ACM SIGPLAN/SIGSOFT Workshop Program Analysis for Software Tools and Eng (PASTE' 98). Montreal, Quebec,Canada,1998:83-90.
[7] 譚德貴,陳林,王子元,等.通過增大邊際權(quán)重提高基于頻譜的錯誤定位效率[J]. 計算機學(xué)報,2010,33(12):2335-2338.
[8] 陳衍鈴,王正.模糊測試研究進展[J].計算機應(yīng)用與軟件,2011,28(7):291-293.
[9] Sutton M,Amini A G P.Fuzzing:Brute Force Vulnerability Discovery[M].黃隴,于莉莉,李虎,譯.北京:機械工業(yè)出版社,2009:65-66.
[10] Do H,Elbaum S G,Rothermel G.Supporting controlled experimentation with testing techniques: an infrastructure and its potential impact[J]. Empirical Software Engineering,2005,10(4):405-435.
[11] Binkley D.Source code analysis: a road map[C].Proceeding of Future of Software Engineering (FOST' 07),Minneapolis, USA, May 23-25,2997. Washington,DC,USA:IEEE Computer Society,2007:104-119.
[12] Sutton M, Amini A G P Fuzzing: Brute Force Vulnerability Discovery[M]. 黃隴,于莉莉,李虎,譯.北京:機械工業(yè)出版社,2009:48-50.