姜文,劉立康
(西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安710071)
摘要:為了保證基于VxWorks平臺的軟件代碼的質(zhì)量,對軟件源代碼進(jìn)行靜態(tài)檢查非常重要。以ClearCase作為配置管理工具,將重量級靜態(tài)檢查工具Coverity和Fortify集成到持續(xù)集成工具ICPCI上,對軟件源代碼進(jìn)行靜態(tài)檢查。詳細(xì)敘述了Coverity和Fortify編譯器的配置,以及在ICPCI工具的任務(wù)管理頁面上配置檢查任務(wù)。分析了檢查過程中出現(xiàn)各種問題的原因并給出相應(yīng)的解決方案。最后介紹了一個典型案例。工作實踐表明,靜態(tài)檢查有助于及時發(fā)現(xiàn)并解決軟件源代碼的各種缺陷,從而提高軟件質(zhì)量和安全性。
關(guān)鍵詞: 嵌入式操作系統(tǒng);靜態(tài)檢查;持續(xù)集成;安全漏洞
0引言
VxWorks是實時嵌入式操作系統(tǒng)軟件,可以為開發(fā)人員提供高效實時的任務(wù)調(diào)度、中斷管理、系統(tǒng)資源管理和任務(wù)間通信。VxWorks經(jīng)過廣泛驗證,已成功應(yīng)用在航天、航空、艦船、通信、醫(yī)療等關(guān)鍵領(lǐng)域。Tornado[13]是開發(fā)VxWorks應(yīng)用系統(tǒng)的集成開發(fā)環(huán)境。Tornado IDE采用C/C++語言編程,支持GNU C/C++編譯器。
為了保證基于VxWorks平臺的軟件代碼質(zhì)量,檢測軟件源代碼中存在的缺陷和安全漏洞非常重要。本文采用CodeCC(Code Check Center)工具壓縮包開展檢測工作。工具壓縮包中包括靜態(tài)檢查工具Coverity和Fortify,采用靜態(tài)檢查方法檢測源代碼的各種缺陷,將檢查結(jié)果反饋給開發(fā)人員及時處理,從而提高軟件的質(zhì)量和安全性。
1重量級靜態(tài)檢查工具
通常把Coverity和Fortify稱為重量級的靜態(tài)檢查工具。
Coverity Prevent是由Coverity公司開發(fā)的一款高性能靜態(tài)檢查軟件,它是檢測和解決C、C++、Java和C#源代碼中嚴(yán)重缺陷的領(lǐng)先自動化方法。
Fortify SCA(Static Code Analyzer)是一款軟件源代碼缺陷靜態(tài)測試工具,它支持的編程語言多達(dá)17種(包括C、C+、C#、JAVA等),基本上涵蓋了絕大多數(shù)編程語言。
2檢查工具集成到持續(xù)集成工具ICP-CI
本文采用的軟件配置管理工具是ClearCase,持續(xù)集成工具是ICPCI。首先將集成了Coverity和Fortify工具的CodeCC工具的壓縮包CodeCC_Win32.zip拷貝到持續(xù)集成主控服務(wù)器與代理服務(wù)器的plugin目錄下解壓,再分別對Coverity和Fortify工具進(jìn)行相關(guān)的編譯器配置,然后完成搭建構(gòu)建工程。構(gòu)建工程命名為“產(chǎn)品名_版本號_CodeCheck”。
2.1ClearCase版本庫的代碼更新
持續(xù)集成工具ICPCI需要在版本庫鎖庫之后完成源代碼更新,然后進(jìn)行Coverity和Fortify檢查。ICPCI工具執(zhí)行代碼更新時,需要編寫代碼更新的批處理腳本code_update.bat,把代碼更新的腳本配置在任務(wù)中。
2.2Coverity編譯器配置
軟件產(chǎn)品模塊進(jìn)行Coverity檢查時,需要在CodeCC工具的tqeconfig.ini文件中完成編譯器的配置。
對于基于VxWorks平臺的軟件產(chǎn)品,由于各模塊使用的軟、硬件差異,可以使用的編譯器模塊多達(dá)40多個。目前常用的編譯器有10多個。根據(jù)編譯器中采用的CPU類型可以將其分為以下3類(mips、ppc、arm),將這些編譯器配置在tqeconfig.ini文件中。配置內(nèi)容如下:
mips:
ccmips=C:\\NoDist_Tonado2.2\\host\\x86-32\\bin\\ccmpis.exe
ccmips=C:\\Tonado2.2\\host\\x86-32\\bin\\ccmpis.exe
ccmips=C:\\Tonado2.2_1\\host\\x86-32\\bin\\ccmpis.exe
ccmips=C:\\Tonado2.2_cvm\\host\\x86-32\\bin\\ccmpis.exe
ccmips=C:\\TonadoHRD\\host\\x86-32\\bin\\ccmpis.exe
ppc:
ccppc= C:\\Tonado\\host\\x86-32\\bin\\ccppc.exe
ccppc= C:\\Tonado2.0\\host\\x86-32\\bin\\ccppc.exe
ccppc= C:\\Tonado_cxe\\host\\x86-32\\bin\\ccppc.exe
ccppc= C:\\Tonado_2.2.1_ppc\\host\\x86-32\\bin\\ccppc.exe
arm:
ccarm= C:\\TonadoARM\\host\\x86-32\\bin\\ccarm.exe
完成上述編譯器的配置后,執(zhí)行tqeconfig.bat文件,該文件如果執(zhí)行成功則將生成相應(yīng)的配置文件保存在CodeCC\\tool\\coverity\\config目錄下。
完成編譯器配置后,需要將持續(xù)集成主控服務(wù)器和代理服務(wù)器上的Coverity工具路徑plugin\\CodeCC\\tool\\coverity\\bin添加到環(huán)境變量path中。同時需要完成編寫編譯腳本和makefile文件。Coverity不支持分布式編譯加速,編譯過程中不能使用分布式編譯的腳本。
2.3Fortify編譯器配置
2.3.1編譯文件配置
基于VxWork操作系統(tǒng)的編譯器是風(fēng)河公司提供的Tornado交叉編譯器ccmips、ccppc以及ccarm。為使Fortify工具可以識別和使用這些編譯器,需要修改Fortify的配置文件,將VxWorks系統(tǒng)的交叉編譯器配置到fortify-sca.properties文件中。VxWorks操作系統(tǒng)的編譯過程由編譯(cc)、鏈接(ld)以及打包(ar)這3個部分組成,在配置過程中需要對編譯、鏈接和打包依次進(jìn)行配置。在fortify-sca.properties文件中添加配置項如下所示:
com.fortify.sca.compilers.ccmips=com.fortify.sca.util.compilers.Gcccompiler
com.fortify.sca.compilers.ccarm=com.fortify.sca.util.compilers.Gcccompiler
com.fortify.sca.compilers.ccppc=com.fortify.sca.util.compilers.Gcccompiler
com.fortify.sca.compilers.ldmips=com.fortify.sca.util.compilers.ldcompiler
com.fortify.sca.compilers.ldarm=com.fortify.sca.util.compilers.ldcompiler
com.fortify.sca.compilers.ldppc=com.fortify.sca.util.compilers.ldcompiler
com.fortify.sca.compilers.armips=com.fortify.sca.util.compilers.ArUntil
com.fortify.sca.compilers.ararm=com.fortify.sca.util.compilers. ArUntil
com.fortify.sca.compilers.arppc=com.fortify.sca.util.compilers. ArUntil
編譯器配置完成之后,需要將持續(xù)集成主控服務(wù)器與代理服務(wù)器上的Fortify工具路徑plugin\\CodeCC\\tool\\fortify\\bin添加到環(huán)境變量path中。
2.3.2在makefile文件和編譯腳本中嵌入Fortify命令
Fortify工具通過跟蹤編譯器生成中間文件*.nst,進(jìn)行代碼編譯時需要將以前編譯生成的*.obj文件目標(biāo)文件全部刪除,保證Fortify工具跟蹤編譯器生成正確的*.nst文件。同時需要根據(jù)軟件模塊重新編寫編譯腳本和makefile文件,在makefile文件和編譯腳本中嵌入Fortify命令。
2.4ICP-CI的任務(wù)管理頁面上配置檢查任務(wù)
在ICP-CI的任務(wù)管理頁面的構(gòu)建工程上配置CodeCC檢查任務(wù),通常Coverity任務(wù)和Fortify任務(wù)同時配置。以軟件模塊mcs為例來描述配置過程。配置mcs模塊的CodeCC任務(wù)時,在任務(wù)欄上選擇“CodeCC”任務(wù)。對于Coverity任務(wù),將mcs模塊的編譯腳本make_mcs_one_con.bat腳本和mcs模塊編譯腳本路徑配置到CodeCC任務(wù)類型頁面下的編譯腳本、編譯路徑中,選擇編譯類型為gcc,并在任務(wù)選項欄添加“Coverity”任務(wù)。
對于Fortify任務(wù),將mcs模塊的Fortify編譯腳本make_mcs_one_fortify.bat腳本以及mcs模塊編譯腳本路徑配置到CodeCC任務(wù)的fortifyexecutable這個配置項中。最后在任務(wù)類型中再添加“Fortify”任務(wù)。
CodeCC檢查任務(wù)配置到ICP-CI上之后,通常由主控服務(wù)器將任務(wù)下發(fā)至代理服務(wù)器上執(zhí)行。
2.5檢查結(jié)果分析和處理
使用工具ICPCI做CodeCC檢查時,通常先對模塊做Coverity檢查,生成的中間文件壓縮包上傳到指定的分析服務(wù)器;接著對模塊做Fortify檢查,同樣將生成的中間文件壓縮包上傳到同一個分析服務(wù)器。此時ICP-CI的執(zhí)行窗口顯示CodeCC任務(wù)成功并處于等待分析結(jié)果狀態(tài)。
當(dāng)分析服務(wù)器分析完畢,將模塊的分析結(jié)果回傳到ICPCI工具,在ICPCI工具的頁面上可以看到Coverity和Fortify工具各自的檢查結(jié)果。檢查結(jié)果包括模塊的各級別缺陷數(shù)以及總?cè)毕輸?shù)。缺陷級別分為高、中、低3個級別。同時根據(jù)檢查模塊任務(wù)配置的郵件主送人和抄送人,給相關(guān)管理和開發(fā)人員發(fā)送郵件。郵件內(nèi)容為該檢查模塊的Coverity和Fortify檢查日志與檢查結(jié)果下載路徑。
對檢查出來的各種問題,開發(fā)人員下載檢查結(jié)果文件,并對檢查結(jié)果與模塊源代碼進(jìn)行分析。確認(rèn)是源代碼問題,修改源代碼后重新合入版本庫,啟動新一輪的CodeCC檢查。分析之后,確認(rèn)是誤報的缺陷,從ICP-CI上顯示的Coverity和Fortify工具檢查結(jié)果的頁面的“Ignore defects”鏈接進(jìn)入由分析服務(wù)器指定的缺陷庫完成誤報缺陷的屏蔽,屏蔽之后的缺陷呈現(xiàn)為“Dismissed”狀態(tài)。
3CodeCC檢查出現(xiàn)問題的分析和處理
CodeCC檢查失敗需要及時發(fā)現(xiàn)處理,根據(jù)已經(jīng)失敗的模塊、構(gòu)建工程頁面上提示的失敗信息和構(gòu)建工程的詳細(xì)日志文件來確定該模塊檢查失敗的原因和解決問題的方案。CodeCC檢查失敗通常有在編譯階段出錯和在分析階段出錯兩類。
3.1Coverity或Fortify檢查在編譯階段出錯
在編譯階段出錯,查看對應(yīng)的編譯日志可以發(fā)現(xiàn)各種問題(編譯器配置問題、編譯腳本問題和源代碼編譯錯誤等),導(dǎo)致在編譯階段Coverity或Fortify檢查報錯。解決方法如下:
(1)重新進(jìn)行編譯器配置;
?。?)根據(jù)日志所報編譯問題,重新編寫編譯腳本;
?。?)開發(fā)工程師定位模塊編譯錯誤,修改源代碼。
3.2Coverity或Fortify檢查在分析階段出錯
在分析階段出錯,查看對應(yīng)的分析日志可以發(fā)現(xiàn)大部分是分析服務(wù)器問題導(dǎo)致的執(zhí)行失敗,通常表現(xiàn)為上傳中間文件壓縮包失敗、分析結(jié)果回傳失敗等。根據(jù)分析日志發(fā)現(xiàn)此類問題,解決分析服務(wù)器問題。
3.3Coverity檢查文件的比例問題
查看Coverity檢查的日志文件build.log,在該文件的最后查看模塊編譯檢查文件的百分比,如果編譯的文件全部完成檢查,百分比值是100%。如果這個百分比值不是100%,需要在日志文件里查找錯誤。這些錯誤通常不是軟件模塊的代碼編譯錯誤,而是模塊源代碼生成中間文件過程中與編譯器沖突導(dǎo)致的,需要開發(fā)工程師與系統(tǒng)工程師進(jìn)行分析,通過修改源代碼來提高檢查文件的百分比。
4典型案例
某公司的一個軟、硬件結(jié)合的大型開發(fā)項目,總的代碼量超過2 000萬行,采用的配置管理工具為ClearCase,持續(xù)集成使用ICPCI工具。對基于VxWorks操作系統(tǒng)的大量軟件模塊進(jìn)行了CodeCC檢查,工作實踐表明,靜態(tài)檢查有助于及時發(fā)現(xiàn)并解決軟件源代碼的各種缺陷,便于產(chǎn)品項目經(jīng)理了解工作進(jìn)度和解決存在的問題,進(jìn)一步提升產(chǎn)品質(zhì)量。
5結(jié)論
長期的工作實踐表明,CodeCC檢查在嵌入式軟件開發(fā)中可以發(fā)揮重要的作用。檢查工具集成到持續(xù)集成工具ICP-CI,可以自動完成CodeCC檢查,及時向開發(fā)人員反饋檢查結(jié)果,使開發(fā)人員能夠及時修復(fù)源代碼的缺陷,同時也有益于軟件項目管理。軟件開發(fā)的C靜態(tài)檢查工作做好了,將很大程度上提高軟件產(chǎn)品的質(zhì)量,降低軟、硬件開發(fā)的成本。
參考文獻(xiàn)
?。?] 孔祥營,柏桂枝.嵌入式實時操作系統(tǒng) VxWorks 及其開發(fā)環(huán)境 Tornado [M].北京:中國電力出版社,2002.
[2] 蔡建平.嵌入式軟件測試實用技術(shù)[M].北京:清華大學(xué)出版社,2010.
[3] 趙澤榮,劉志勇,林琳,等.基于VxWorks的ADSB地面站熱備份設(shè)計與實現(xiàn)[J].微型機(jī)與應(yīng)用,2014,33(20):7779.
[4] 吳世忠,郭濤,董國偉,等,軟件漏洞分析技術(shù)[M].北京:科學(xué)出版社,2014.
?。?] ALMOSSAWI A, LIM K,TANMAY.Analysis tool evaluation:coverity prevent[R]. SinhaCarnegie Mellon University, 2006.
?。?] Coverity Inc. Coverity scan:2013 open source report[R].2014.