梅 磊 劉先博
(中國電子科技集團(tuán)38所,合肥,230000)
Klocwork在軍用軟件測試中的應(yīng)用
梅 磊 劉先博
(中國電子科技集團(tuán)38所,合肥,230000)
文摘:分析在軟件測試工作中出現(xiàn)的大量重復(fù)性工作,引用軟件工程化管理的自動(dòng)化測試思維,自主定制測試腳本,在Windows系統(tǒng)及國產(chǎn)麒麟操作系統(tǒng)下使用Klocwork測試工具進(jìn)行自動(dòng)化測試設(shè)計(jì)、實(shí)現(xiàn)和應(yīng)用,通過在項(xiàng)目開發(fā)過程中定期循環(huán)交替進(jìn)行Klocwork的全面檢查,發(fā)現(xiàn)集成測試和系統(tǒng)測試所不能發(fā)現(xiàn)的問題,提高項(xiàng)目代碼的質(zhì)量,降低整個(gè)測試過程的成本。
靜態(tài)分析;靜態(tài)測試;軟件工程化。
隨著我國國防實(shí)力的穩(wěn)步提升以及軍用裝備信息化建設(shè)要求的提高,對(duì)軍用裝備軟件系統(tǒng)的要求也越來越高,其安全性與穩(wěn)定性已成為裝備研發(fā)過程的重中之重。然而,在軍用軟件開發(fā)期間,由于人為因素引入的錯(cuò)誤,隱藏了許多難以發(fā)現(xiàn)的缺陷。通過使用多種專用的軟件代碼靜態(tài)分析工具,既可以有效提高我們測試人員的測試效率,又可以即時(shí)的、準(zhǔn)確的分析源代碼,識(shí)別軟件中嚴(yán)重的安全性缺陷和質(zhì)量缺陷,延長復(fù)雜軟件的生命周期。有效地使用軟件靜態(tài)分析工具實(shí)現(xiàn)對(duì)軍用軟件問題的發(fā)掘與探索、提高軟件測試工作的質(zhì)量和效率已經(jīng)成為軟件測試領(lǐng)域的應(yīng)用熱點(diǎn)。
Klocwork軟件是Klocwork公司基于專利技術(shù)分析引擎開發(fā)、綜合了近年來各種最先進(jìn)的靜態(tài)分析技術(shù)而形成的一款具有很多突出特征的靜態(tài)分析工具,利用其專利技術(shù)能發(fā)現(xiàn)全面且詳細(xì)的軟件缺陷種類,它支持現(xiàn)行市面常用的編程語言(如C、C++和Java等)。同時(shí),還支持多種度量以及代碼規(guī)范的檢查,可以通過設(shè)置相應(yīng)的閾值,提高檢測效率。特別針對(duì)C/C++語言引用的非法指針、內(nèi)存泄漏、數(shù)組越界及緩沖區(qū)溢出等缺陷的檢測擁有不俗的表現(xiàn)。該工具對(duì)軟件架構(gòu)、編程規(guī)則的違反情況提供可視化的架構(gòu)分析及優(yōu)化建議,并與多種主流的IDE開發(fā)環(huán)境進(jìn)行集成,可持續(xù)為大型及超大型(上千萬代碼行)軟件項(xiàng)目提供測試支持。
1.1 工作內(nèi)容
由于Klocwork的測試環(huán)境通常不直接向用戶提供自動(dòng)測試框架或者腳本,而往往要借助于集成開發(fā)環(huán)境或腳本來實(shí)現(xiàn)自動(dòng)化測試。通常測試前,首先就要明確被測軟件的測試環(huán)境,在被測軟件和測試工具中建立穩(wěn)固的聯(lián)系,這樣才能順利保證靜態(tài)分析工作的進(jìn)行。
Klocwork是一種基于Client/Server架構(gòu)的源代碼靜態(tài)分析工具,支持多語言、多平臺(tái)的各類集成開發(fā)環(huán)境。同時(shí),利用On The Fly技術(shù)可以在配置完成后瞬間開始進(jìn)行分析,并且可以拖拽式地生成測試報(bào)告,極大地提高和方便測試人員在本地查看、修改代碼中的錯(cuò)誤。在外場的開發(fā)人員和測試人員也可以非常方便地利用Klocwork的這一特點(diǎn),應(yīng)用Trace Back技術(shù)來對(duì)發(fā)現(xiàn)的問題繼續(xù)追溯,對(duì)Bug的發(fā)現(xiàn)和管理也提供了一種新的思路。如果在遇到外場軟件項(xiàng)目開發(fā)周期緊張的情況下,測試人員可用便攜式測試設(shè)備在實(shí)裝環(huán)境下完成軟件的靜態(tài)分析工作,然后將測試數(shù)據(jù)注入本地測試分析數(shù)據(jù)庫內(nèi),以供每位測試人員對(duì)測試結(jié)果進(jìn)行分析和整理,極大地改善了測試環(huán)境的局限性,提高了外場測試工作的靈活性。
Klocwork的代碼靜態(tài)分析環(huán)境結(jié)構(gòu)如圖1所示。
在當(dāng)前版本的Klocwork分析界面中,工具將找到的缺陷明確分為致命(critical)、嚴(yán)重(severe)、錯(cuò)誤(error)和非預(yù)期(unexpected)等10個(gè)等級(jí),并且對(duì)于各類問題都有明確、詳細(xì)的解釋與說明。同時(shí),對(duì)于發(fā)現(xiàn)的每個(gè)問題,通過簡易的操作便可追溯到具體的代碼行,直觀、簡潔地對(duì)問題進(jìn)行分析與修改。特別是,作為嚴(yán)重影響軟件正常工作、在日常測試工作中最為重視的致命性錯(cuò)誤,Klocwork將空指針引用、緩沖區(qū)溢出、數(shù)組越界、內(nèi)存泄漏等19類錯(cuò)誤列入其中,并針對(duì)每類典型錯(cuò)誤都列舉了實(shí)例,便于操作人員的理解和使用。
Klocwork可以對(duì)當(dāng)前我國軍用雷達(dá)裝備的軟件系統(tǒng)研發(fā)平臺(tái)及環(huán)境提供完整的支持。其主要特點(diǎn)包括:多語言——C、C++、匯編等;多平臺(tái)——Windows、Linux等;支持多種編譯器——ARM系列、TI系列、WinderRiver系列、Microsoft Visual C++、Green Hills系列等;支持的集成開發(fā)環(huán)境——Microsoft Visual Studio 6.0及以上、Tornado 2.0及以上、Visual DSP++5.0及以上、QT4.8.0及以上等。
1.2 工作流程
針對(duì)基于Klocwork搭建的自動(dòng)化測試流程必須基于各種編輯器的命令行操作界面方式來設(shè)計(jì),同時(shí)按照測試人員的測試需求,軟件模塊的優(yōu)先級(jí),以及不同程度下軟件代碼的復(fù)雜程度,通過設(shè)計(jì)和編寫符合要求的自動(dòng)化測試腳本來實(shí)現(xiàn)靜態(tài)分析的自動(dòng)化測試過程。在命令行界面編譯模式下的Klocwork測試工作流程如圖2所示。
Klocwork測試工作主要有以下幾個(gè)步驟。
a)打開安裝路徑E∶KlocworkServer 10.0config的文件夾中kwfilter.conf文件,查看當(dāng)前Klockwork命令是否支持被測軟件的編譯器。
b)運(yùn)行make-f Makefile clean來清理陳舊的構(gòu)建,或手動(dòng)刪除已生產(chǎn)的目標(biāo)文件。
c)使用被測軟件的編譯器在相匹配的編譯環(huán)境中對(duì)被測軟件進(jìn)行編譯。
d)啟動(dòng)KMC服務(wù)功能,并創(chuàng)建項(xiàng)目,設(shè)置項(xiàng)目屬性,同時(shí)添加被測軟件源代碼文件。
e)開始測試執(zhí)行階段,利用kwinject命令來獲取編譯過程信息:kwinject C∶Program Files (x86)Analog DevicesVisualDSP 5.0gmake-378"-f dsp3.mak dsp3_Debug。
f)通過kwbuildproject命令來分析被測軟件源代碼:kwbuildproject--urlhttp∶//localhost∶8080/my_project-o my_tables kwinject.out。
g)待工具分析結(jié)束后,將分析結(jié)果上傳至服務(wù)器,如kwadmin--url http∶//server2∶8080/ load my_project my_tables。
h)登陸http∶//localhost∶8080/即可查看靜態(tài)分析結(jié)果。
Klocwork對(duì)于不同編譯環(huán)境下的分析執(zhí)行過程雖然大同小異,但仍存在一定程度上的差異。因此,導(dǎo)致編譯過程或分析過程出現(xiàn)錯(cuò)誤,而無法正常得到靜態(tài)分析結(jié)果。以下將從當(dāng)前軍用軟件常用開發(fā)平臺(tái)(Windows、基于linux平臺(tái)開發(fā)的軍用軟件逐漸轉(zhuǎn)向使用國產(chǎn)麒麟系統(tǒng))來分別描述在不同平臺(tái)下,配合不同類型的集成開發(fā)環(huán)境,Klocwork的靜態(tài)測試過程。
由于歷史原因使得國內(nèi)很多的軍用軟件開發(fā)環(huán)境仍是基于Windows系統(tǒng),即基于Windows系統(tǒng)開發(fā)而來的軟件在日常的測試工作中還是占了很大一個(gè)部分,因此靈活地使用Klocwork對(duì)這類程序進(jìn)行靜態(tài)分析就顯得尤為重要。下面將以Windows系統(tǒng)下基于DSP++5.0開發(fā)環(huán)境的軍用軟件靜態(tài)測試過程為例,詳細(xì)描述此類軟件的靜態(tài)分析過程?;赪indows系統(tǒng)的靜態(tài)分析環(huán)境見表1。
表1 基于Windows平臺(tái)的靜態(tài)分析環(huán)境
具備靜態(tài)分析測試環(huán)境后,按照如圖3所示流程進(jìn)行配置,并進(jìn)行分析執(zhí)行過程。
a)打開Visual DSP++的IDE,導(dǎo)入被測軟件Pro_1的項(xiàng)目文件,并進(jìn)行編譯。
b)在CMD運(yùn)行模式下,測試DSP++編譯器的可用性:gmake-378-h(huán)。
c)將當(dāng)前工作路徑轉(zhuǎn)換至Pro_1源代碼所在路徑E:mcfx_4dspPro_1。
d)Clean項(xiàng)目Pro_1的生成文件,并用命令行對(duì)源代碼重新進(jìn)行編譯:gmake-378-f Pro_1.mak Pro_1_Debug“.constant_object_parameter.c”。
e)編譯通過后,再次執(zhí)行Clean操作,并使用kwinject命令重新獲取編譯過程信息:kwinjectgmake-378-fPro_1.mak Pro_1_Debug,編譯結(jié)束后,在Pro_1的根目錄下生成kwinject.out的文件。
f)在Klocwork中創(chuàng)建Pro_1項(xiàng)目ksadmin-url http∶//localhost∶8080/create-project mcfx_4dsp_1。
g)對(duì)Pro_1使用kwbuildproject命令進(jìn)行分析:kwbuildproject-urlhttp∶//localhost∶8080/mcfx _4dsp_3-o my_tables kwinject.out,同時(shí)在Pro_1根目錄下生成my_tables文件夾。
h)向服務(wù)器數(shù)據(jù)庫上傳本次分析結(jié)果:kwadmin-urlhttp∶//localhost∶8080/loadmcfx_4dsp _3 my_tables。
i)登陸服務(wù)器客戶端,查看靜態(tài)分析結(jié)果。
近年來,隨著網(wǎng)絡(luò)技術(shù)和信息技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)技術(shù)和信息技術(shù)安全已經(jīng)與我國政治、經(jīng)濟(jì)、國防、文化等公共安全密不可分。而我國操作系統(tǒng)市場在以往一直被微軟的Windows壟斷,所以推動(dòng)國產(chǎn)操作系統(tǒng)的發(fā)展也是國家重要的發(fā)展方向。中標(biāo)麒麟(GeoKylin)操作系統(tǒng)是目前國內(nèi)安全級(jí)別最高的操作系統(tǒng),并且可以為各類用戶提供全方位的應(yīng)用安全保護(hù),可以為軍用軟件提供更加安全、可靠的運(yùn)行環(huán)境?;谥袠?biāo)麒麟系統(tǒng)的靜態(tài)分析環(huán)境見表2。
表2 基于麒麟平臺(tái)的靜態(tài)分析環(huán)境
由于麒麟系統(tǒng)基于linux內(nèi)核,與Windows系統(tǒng)下使用Klocwork進(jìn)行靜態(tài)分析的過程會(huì)有異同,而且更加繁瑣。為了能夠縮減配置的步驟,提高開展靜態(tài)分析的效率,我們利用系統(tǒng)提供的命令,編寫靜態(tài)分析腳本,部分腳本如下所示:
“#####功能:klocwork自動(dòng)分析項(xiàng)目腳本
#************被測軟件參數(shù)************
#被測軟件名稱
project_name="Pro_2"
#被測軟件makefile文件路徑
project_path=/home/Project Case/Pro_2/exe
#********klocwork安裝的參數(shù)***********
#klocwork安裝目錄
kloc_dir=$HOME/klocwork
#klocwork server
KWSRV=http∶//localhost∶8080
#*****************************
……
#Create a project
kwadmin--url$KWSRVcreate-project $project_name
……
#Analyze the project
clean_tables_dir$tables_directory
mkdir$tables_directory
kwbuildproject--url$KWSRV/$project_name-f-o$tables_directory kwinject.out
……”。
在使用過程中應(yīng)特別要注意的是,在使用前,需要將被測軟件參數(shù)中的項(xiàng)目名稱和路徑修改為Pro_2對(duì)應(yīng)的項(xiàng)目信息。若為初次使用,必須要設(shè)置Klocwork安裝的參數(shù),而且項(xiàng)目名稱、路徑均不能使用中文。腳本自動(dòng)執(zhí)行完成后,系統(tǒng)會(huì)將靜態(tài)分析結(jié)果自動(dòng)上傳至測試數(shù)據(jù)服務(wù)器以供測試人員使用。
對(duì)某軍用軟件項(xiàng)目4種主流測試工具(Pro_1、Pro_2經(jīng)過Klocwork、QAC、Testbed、C++Test)進(jìn)行靜態(tài)分析測試,測試效率與測試結(jié)果統(tǒng)計(jì)分別見表3、表4。表3為幾種主流測試工具對(duì)同一項(xiàng)目測試后的統(tǒng)計(jì)時(shí)間;表4為工程項(xiàng)目經(jīng)過測試后得到的缺陷級(jí)別、缺陷類型及缺陷個(gè)數(shù)的統(tǒng)計(jì)結(jié)果。
由表3可以得出,對(duì)于項(xiàng)目Pro_1的靜態(tài)測試工作,4種測試工具所用時(shí)間差距不大,基本可忽略不計(jì)。其中Klocwork由于省略了測試類型人工選擇的過程,所耗時(shí)間最短,擁有較高的測試效率,而Testbed由于測試類型較多,所以花費(fèi)的時(shí)間最長。后期,選用更大代碼量的項(xiàng)目Pro_2來進(jìn)行靜態(tài)分析,從測試結(jié)果來看,Klocwork自動(dòng)化測試方法的優(yōu)越性便體現(xiàn)出來,成為唯一一個(gè)在1h以內(nèi)完成測試分析的工具。因此,對(duì)于軟件項(xiàng)目而言,代碼量越大,Klocwork的自動(dòng)化測試過程所體現(xiàn)的優(yōu)越性會(huì)越明顯。
表3 主流靜態(tài)分析工具測試效率比較
表4 主流靜態(tài)分析工具測試結(jié)果比較
表4列舉了4種測試工具發(fā)現(xiàn)的10種同類問題及個(gè)數(shù)的統(tǒng)計(jì)結(jié)果,而對(duì)于個(gè)別只被其中某一種或兩種工具檢測到的問題,此次則未列入其中。
由結(jié)果可以得出,在此次靜態(tài)分析測試過程中,Klocwork共發(fā)現(xiàn)了70個(gè)問題缺陷,雖然問題總數(shù)稍少于QAC,但其中所包含的致命缺陷(19)和重要缺陷(18)均為4種工具中發(fā)現(xiàn)個(gè)數(shù)最多的。而這也恰恰是我們針對(duì)軟件靜態(tài)分析最為重視的地方,因?yàn)檫@些問題的存在不僅會(huì)導(dǎo)致軟件程序的易讀性、維護(hù)性等方面出現(xiàn)問題,特別情況下,還可能導(dǎo)致出現(xiàn)程序死機(jī)、異常退出等嚴(yán)重狀況。同時(shí),Klocwork工具所發(fā)現(xiàn)的缺陷更多的是一類比較隱秘、不易發(fā)現(xiàn)的問題,如數(shù)組越界、資源泄漏等,都容易造成不可意料的經(jīng)濟(jì)損失和安全隱患。
各類代碼靜態(tài)分析工具均有各自的側(cè)重點(diǎn)。如:QAC分析偏重編碼風(fēng)格、冗余代碼、函數(shù)類型等編碼規(guī)則方面的審查;Klocwork軟件則側(cè)重于內(nèi)存泄露、空指針引用等靜態(tài)分析方面;Testbed傾向于發(fā)現(xiàn)代碼本身不符合編碼規(guī)則的問題;而C++Test能夠很好地發(fā)現(xiàn)變量未初始化和資源泄露等各類代碼結(jié)構(gòu)的問題。因此,在日常工作中,通常會(huì)將各種測試工具配合使用,取長補(bǔ)短,不僅能提高代碼靜態(tài)分析的覆蓋率,而且能很好的提高測試效率、拓展測試的深度與廣度,這種方式也逐漸成為大多數(shù)軟件測評(píng)機(jī)構(gòu)的選擇之一。
直接針對(duì)代碼進(jìn)行靜態(tài)分析可以在系統(tǒng)測試前找到很多問題、大幅度減少在系統(tǒng)測試時(shí)發(fā)現(xiàn)問題以及修復(fù)問題的時(shí)間,最終提高軟件測試環(huán)節(jié)的效率。在項(xiàng)目開發(fā)過程中定期循環(huán)交替進(jìn)行Klocwork的全面檢查,能夠發(fā)現(xiàn)集成測試和系統(tǒng)測試所不能發(fā)現(xiàn)的問題,不斷提高項(xiàng)目代碼的質(zhì)量,降低整個(gè)測試過程的人力成本、時(shí)間成本。這對(duì)于軍用軟件較高產(chǎn)品成熟度的要求顯得尤為重要,也使得自動(dòng)化測試工具Klocwork的廣泛使用,已然成為當(dāng)前普遍的應(yīng)用趨勢。
[1]尹浩,于秀山.程序設(shè)計(jì)缺陷分析與實(shí)踐[M].北京∶電子工業(yè)出版社,2011.
[2]蔡建平.嵌入式軟件測試實(shí)用技術(shù)[M].清華大學(xué)出版社,2010.
[3]黎連業(yè),王華,李淑春.軟件測試與測試技術(shù)[M].清華大學(xué)出版社,2009.[4]許育誠.軟件測試與質(zhì)量管理[M].電子工業(yè)出版社,2004.
[5]杜會(huì)斌,吳曉娟,周旭.自動(dòng)測試在軍事電子技術(shù)中的應(yīng)用[J].無線電工程,2005,35(9).
[6]MARK,F(xiàn)WESTER.軟件測試自動(dòng)化技術(shù)與實(shí)例詳解[M].電子工業(yè)出版社,2000.
[7]路曉麗,等.軟件測試技術(shù)[M].機(jī)械工業(yè)出版社,2007.
[8]Cem Kaner,Jack Falk,Hung Quoc Nguyen.計(jì)算機(jī)軟件測試[M].機(jī)械工業(yè)出版社,2005.
[9]呂云翔,王洋,肖咚.軟件測試案例教程[M].機(jī)械工業(yè)出版社,2011.
[10]梅爾斯.軟件測試的藝術(shù)[M].機(jī)械工業(yè)出版社,2006.
梅磊(1987年—),碩士,軟件系統(tǒng)研究部助理工程師,研究領(lǐng)域:軟件測試、軟件工程化。