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