《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于VxWorks平臺的軟件重量級靜態(tài)檢查
基于VxWorks平臺的軟件重量級靜態(tài)檢查
2016年微型機(jī)與應(yīng)用第06期
姜文,劉立康
(西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安710071)
摘要: 為了保證基于VxWorks平臺的軟件代碼的質(zhì)量,,對軟件源代碼進(jìn)行靜態(tài)檢查非常重要,。以ClearCase作為配置管理工具,將重量級靜態(tài)檢查工具Coverity和Fortify集成到持續(xù)集成工具ICPCI上,,對軟件源代碼進(jìn)行靜態(tài)檢查。詳細(xì)敘述了Coverity和Fortify編譯器的配置,以及在ICPCI工具的任務(wù)管理頁面上配置檢查任務(wù),。分析了檢查過程中出現(xiàn)各種問題的原因并給出相應(yīng)的解決方案。最后介紹了一個典型案例,。工作實踐表明,,靜態(tài)檢查有助于及時發(fā)現(xiàn)并解決軟件源代碼的各種缺陷,從而提高軟件質(zhì)量和安全性,。
Abstract:
Key words :

  姜文,,劉立康

  (西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安710071)

  摘要:為了保證基于VxWorks平臺的軟件代碼的質(zhì)量,,對軟件源代碼進(jìn)行靜態(tài)檢查非常重要,。以ClearCase作為配置管理工具,將重量級靜態(tài)檢查工具Coverity和Fortify集成到持續(xù)集成工具ICPCI上,,對軟件源代碼進(jìn)行靜態(tài)檢查,。詳細(xì)敘述了Coverity和Fortify編譯器的配置,以及在ICPCI工具的任務(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[13]是開發(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ù)集成工具是ICPCI,。首先將集成了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ù)集成工具ICPCI需要在版本庫鎖庫之后完成源代碼更新,然后進(jìn)行Coverity和Fortify檢查,。ICPCI工具執(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é)果分析和處理

  使用工具ICPCI做CodeCC檢查時,通常先對模塊做Coverity檢查,,生成的中間文件壓縮包上傳到指定的分析服務(wù)器,;接著對模塊做Fortify檢查,同樣將生成的中間文件壓縮包上傳到同一個分析服務(wù)器,。此時ICP-CI的執(zhí)行窗口顯示CodeCC任務(wù)成功并處于等待分析結(jié)果狀態(tài),。

  當(dāng)分析服務(wù)器分析完畢,將模塊的分析結(jié)果回傳到ICPCI工具,,在ICPCI工具的頁面上可以看到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ù)集成使用ICPCI工具,。對基于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)

  [1] 孔祥營,,柏桂枝.嵌入式實時操作系統(tǒng) VxWorks 及其開發(fā)環(huán)境 Tornado [M].北京:中國電力出版社,,2002.

  [2] 蔡建平.嵌入式軟件測試實用技術(shù)[M].北京:清華大學(xué)出版社,,2010.

 ?。?] 趙澤榮,劉志勇,林琳,等.基于VxWorks的ADSB地面站熱備份設(shè)計與實現(xiàn)[J].微型機(jī)與應(yīng)用,2014,33(20):7779.

 ?。?] 吳世忠,,郭濤,董國偉,,等,,軟件漏洞分析技術(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.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。