《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(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)的解決方案。最后介紹了一個(gè)典型案例。工作實(shí)踐表明,靜態(tài)檢查有助于及時(shí)發(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)的解決方案。最后介紹了一個(gè)典型案例。工作實(shí)踐表明,靜態(tài)檢查有助于及時(shí)發(fā)現(xiàn)并解決軟件源代碼的各種缺陷,從而提高軟件質(zhì)量和安全性。

  關(guān)鍵詞嵌入式操作系統(tǒng);靜態(tài)檢查;持續(xù)集成;安全漏洞

0引言

  VxWorks是實(shí)時(shí)嵌入式操作系統(tǒng)軟件,可以為開發(fā)人員提供高效實(shí)時(shí)的任務(wù)調(diào)度、中斷管理、系統(tǒng)資源管理和任務(wù)間通信。VxWorks經(jīng)過廣泛驗(yàn)證,已成功應(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ā)人員及時(shí)處理,從而提高軟件的質(zhì)量和安全性。

1重量級靜態(tài)檢查工具

  通常把Coverity和Fortify稱為重量級的靜態(tài)檢查工具。

  Coverity Prevent是由Coverity公司開發(fā)的一款高性能靜態(tài)檢查軟件,它是檢測和解決C、C++、Java和C#源代碼中嚴(yán)重缺陷的領(lǐng)先自動(dò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í)行代碼更新時(shí),需要編寫代碼更新的批處理腳本code_update.bat,把代碼更新的腳本配置在任務(wù)中。

  2.2Coverity編譯器配置

  軟件產(chǎn)品模塊進(jìn)行Coverity檢查時(shí),需要在CodeCC工具的tqeconfig.ini文件中完成編譯器的配置。

  對于基于VxWorks平臺的軟件產(chǎn)品,由于各模塊使用的軟、硬件差異,可以使用的編譯器模塊多達(dá)40多個(gè)。目前常用的編譯器有10多個(gè)。根據(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中。同時(shí)需要完成編寫編譯腳本和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個(gè)部分組成,在配置過程中需要對編譯、鏈接和打包依次進(jìn)行配置。在fortify-sca.properties文件中添加配置項(xiàng)如下所示:

  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)行代碼編譯時(shí)需要將以前編譯生成的*.obj文件目標(biāo)文件全部刪除,保證Fortify工具跟蹤編譯器生成正確的*.nst文件。同時(shí)需要根據(jù)軟件模塊重新編寫編譯腳本和makefile文件,在makefile文件和編譯腳本中嵌入Fortify命令。

  2.4ICP-CI的任務(wù)管理頁面上配置檢查任務(wù)

  在ICP-CI的任務(wù)管理頁面的構(gòu)建工程上配置CodeCC檢查任務(wù),通常Coverity任務(wù)和Fortify任務(wù)同時(shí)配置。以軟件模塊mcs為例來描述配置過程。配置mcs模塊的CodeCC任務(wù)時(shí),在任務(wù)欄上選擇“CodeCC”任務(wù)。對于Coverity任務(wù),將mcs模塊的編譯腳本make_mcs_one_con.bat腳本和mcs模塊編譯腳本路徑配置到CodeCC任務(wù)類型頁面下的編譯腳本、編譯路徑中,選擇編譯類型為gcc,并在任務(wù)選項(xiàng)欄添加“Coverity”任務(wù)。

  對于Fortify任務(wù),將mcs模塊的Fortify編譯腳本make_mcs_one_fortify.bat腳本以及mcs模塊編譯腳本路徑配置到CodeCC任務(wù)的fortifyexecutable這個(gè)配置項(xiàng)中。最后在任務(wù)類型中再添加“Fortify”任務(wù)。

  CodeCC檢查任務(wù)配置到ICP-CI上之后,通常由主控服務(wù)器將任務(wù)下發(fā)至代理服務(wù)器上執(zhí)行。

  2.5檢查結(jié)果分析和處理

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

  當(dāng)分析服務(wù)器分析完畢,將模塊的分析結(jié)果回傳到ICPCI工具,在ICPCI工具的頁面上可以看到Coverity和Fortify工具各自的檢查結(jié)果。檢查結(jié)果包括模塊的各級別缺陷數(shù)以及總?cè)毕輸?shù)。缺陷級別分為高、中、低3個(gè)級別。同時(shí)根據(jù)檢查模塊任務(wù)配置的郵件主送人和抄送人,給相關(guān)管理和開發(fā)人員發(fā)送郵件。郵件內(nèi)容為該檢查模塊的Coverity和Fortify檢查日志與檢查結(jié)果下載路徑。

  對檢查出來的各種問題,開發(fā)人員下載檢查結(jié)果文件,并對檢查結(jié)果與模塊源代碼進(jìn)行分析。確認(rèn)是源代碼問題,修改源代碼后重新合入版本庫,啟動(dòng)新一輪的CodeCC檢查。分析之后,確認(rèn)是誤報(bào)的缺陷,從ICP-CI上顯示的Coverity和Fortify工具檢查結(jié)果的頁面的“Ignore defects”鏈接進(jìn)入由分析服務(wù)器指定的缺陷庫完成誤報(bào)缺陷的屏蔽,屏蔽之后的缺陷呈現(xiàn)為“Dismissed”狀態(tài)。

3CodeCC檢查出現(xiàn)問題的分析和處理

  CodeCC檢查失敗需要及時(shí)發(fā)現(xiàn)處理,根據(jù)已經(jīng)失敗的模塊、構(gòu)建工程頁面上提示的失敗信息和構(gòu)建工程的詳細(xì)日志文件來確定該模塊檢查失敗的原因和解決問題的方案。CodeCC檢查失敗通常有在編譯階段出錯(cuò)和在分析階段出錯(cuò)兩類。

  3.1Coverity或Fortify檢查在編譯階段出錯(cuò)

  在編譯階段出錯(cuò),查看對應(yīng)的編譯日志可以發(fā)現(xiàn)各種問題(編譯器配置問題、編譯腳本問題和源代碼編譯錯(cuò)誤等),導(dǎo)致在編譯階段Coverity或Fortify檢查報(bào)錯(cuò)。解決方法如下:

 ?。?)重新進(jìn)行編譯器配置;

 ?。?)根據(jù)日志所報(bào)編譯問題,重新編寫編譯腳本;

  (3)開發(fā)工程師定位模塊編譯錯(cuò)誤,修改源代碼。

  3.2Coverity或Fortify檢查在分析階段出錯(cuò)

  在分析階段出錯(cuò),查看對應(yīng)的分析日志可以發(fā)現(xiàn)大部分是分析服務(wù)器問題導(dǎo)致的執(zhí)行失敗,通常表現(xiàn)為上傳中間文件壓縮包失敗、分析結(jié)果回傳失敗等。根據(jù)分析日志發(fā)現(xiàn)此類問題,解決分析服務(wù)器問題。

  3.3Coverity檢查文件的比例問題

  查看Coverity檢查的日志文件build.log,在該文件的最后查看模塊編譯檢查文件的百分比,如果編譯的文件全部完成檢查,百分比值是100%。如果這個(gè)百分比值不是100%,需要在日志文件里查找錯(cuò)誤。這些錯(cuò)誤通常不是軟件模塊的代碼編譯錯(cuò)誤,而是模塊源代碼生成中間文件過程中與編譯器沖突導(dǎo)致的,需要開發(fā)工程師與系統(tǒng)工程師進(jìn)行分析,通過修改源代碼來提高檢查文件的百分比。

4典型案例

  某公司的一個(gè)軟、硬件結(jié)合的大型開發(fā)項(xiàng)目,總的代碼量超過2 000萬行,采用的配置管理工具為ClearCase,持續(xù)集成使用ICPCI工具。對基于VxWorks操作系統(tǒng)的大量軟件模塊進(jìn)行了CodeCC檢查,工作實(shí)踐表明,靜態(tài)檢查有助于及時(shí)發(fā)現(xiàn)并解決軟件源代碼的各種缺陷,便于產(chǎn)品項(xiàng)目經(jīng)理了解工作進(jìn)度和解決存在的問題,進(jìn)一步提升產(chǎn)品質(zhì)量。

5結(jié)論

  長期的工作實(shí)踐表明,CodeCC檢查在嵌入式軟件開發(fā)中可以發(fā)揮重要的作用。檢查工具集成到持續(xù)集成工具ICP-CI,可以自動(dòng)完成CodeCC檢查,及時(shí)向開發(fā)人員反饋檢查結(jié)果,使開發(fā)人員能夠及時(shí)修復(fù)源代碼的缺陷,同時(shí)也有益于軟件項(xiàng)目管理。軟件開發(fā)的C靜態(tài)檢查工作做好了,將很大程度上提高軟件產(chǎn)品的質(zhì)量,降低軟、硬件開發(fā)的成本。

參考文獻(xiàn)

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

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

  [3] 趙澤榮,劉志勇,林琳,等.基于VxWorks的ADSB地面站熱備份設(shè)計(jì)與實(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.

  [6] Coverity Inc. Coverity scan:2013 open source report[R].2014.


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