萬(wàn)澤超 朱轉(zhuǎn)平 黎劍愛
摘 要:如今嵌入式系統(tǒng)在越來(lái)越多的場(chǎng)合被使用,嵌入式軟件的質(zhì)量是影響系統(tǒng)研發(fā)進(jìn)度及結(jié)果的關(guān)鍵因素。鑒于此,嵌入式軟件測(cè)試工作逐漸受到軟件研發(fā)部門及質(zhì)檢部門的重視,對(duì)應(yīng)用在這些領(lǐng)域的嵌入式軟件進(jìn)行專業(yè)的測(cè)試很有必要。本文基于對(duì)嵌入式軟件靜態(tài)測(cè)試相關(guān)問題進(jìn)行分析和研究。
關(guān)鍵詞:嵌入式軟件;靜態(tài)測(cè)試;C++Test;PC-Lint
一、嵌入式軟件的特點(diǎn)及本身缺陷
首先,嵌入式軟件具有實(shí)時(shí)性。例如很多移動(dòng)智能設(shè)備系統(tǒng)中的嵌入式軟件要求軟件能夠?qū)崿F(xiàn)實(shí)時(shí)運(yùn)行,在特定時(shí)間內(nèi)需完成接收、處理、發(fā)送信息等一系列任務(wù),對(duì)處理時(shí)間、處理任務(wù)的時(shí)序性、軟件運(yùn)行速度以及避免運(yùn)行時(shí)內(nèi)存遺漏都有嚴(yán)格要求。嵌入式軟件要求高可靠性。嵌入式軟件一般有別與通用軟件適用環(huán)境,其工作環(huán)境常常伴隨著強(qiáng)輻射、強(qiáng)磁場(chǎng)、真空、遠(yuǎn)距離操控等復(fù)雜問題。嵌入式軟件具有專用性。嵌入式軟件的開發(fā)一般是針對(duì)特定用途、特定場(chǎng)景,具有很強(qiáng)的專用性。嵌入式軟件與硬件關(guān)系密切。嵌入式系統(tǒng)由軟件和硬件組成,其中軟件部分正是為硬件部分設(shè)計(jì)的。嵌入式軟件的編寫還涉及到嵌入式系統(tǒng)的外圍設(shè)備,例如通信接口、輸入/輸出設(shè)備、外設(shè)接口等。由于C/C++語(yǔ)言本身風(fēng)格自由易出錯(cuò),程序員在編寫過程中要格外注意防止安全漏洞的產(chǎn)生。通過靜態(tài)測(cè)試工具輔助程序員排除緩沖區(qū)溢出、數(shù)組越界、指針引用錯(cuò)誤、內(nèi)存泄漏等安全隱患,消除代碼缺陷的同時(shí)保障程序的安全。
二、靜態(tài)測(cè)試工具及方法
由于嵌入式系統(tǒng)自身是由軟硬件結(jié)合的特點(diǎn),其軟件的代碼編寫過程中會(huì)涉及到對(duì)硬件的操作。由于C語(yǔ)言本身可以對(duì)硬件操作,又具有易學(xué)、靈活、可移植、高效率等特點(diǎn),C語(yǔ)言日漸成為嵌入式軟件的主要編程語(yǔ)言。C++是C語(yǔ)言的增強(qiáng)版,也在一定程度上繼承了C語(yǔ)言的缺陷,C/C++語(yǔ)言其本身都屬于弱類型語(yǔ)言,允許變量類型隱式轉(zhuǎn)換,導(dǎo)致開發(fā)效率高的同時(shí)可靠性較弱。而且C/C++編譯器不進(jìn)行強(qiáng)制類型檢查,也不做任何邊界檢查,很容易存在代碼安全隱患。大多數(shù)靜態(tài)測(cè)試工具都支持靜態(tài)測(cè)試規(guī)則檢查。對(duì)于嵌入式軟件測(cè)試規(guī)則的制定,國(guó)內(nèi)外已經(jīng)有很多成熟的案例。嵌入式軟件靜態(tài)測(cè)試和通用軟件靜態(tài)測(cè)試的方法大致相同,區(qū)別之處在于針對(duì)其軟件自身特點(diǎn)有針對(duì)性的去檢測(cè)。常見的測(cè)試工具有很多,例如FortifySCA、Coverity、C++Test、PC-Lint、CppCheck等,以下將一一闡述:
2.1C++Test
C++Test是Parasoft公司的基于C/C++的測(cè)試工具,涵蓋靜態(tài)測(cè)試、單元測(cè)試、回歸測(cè)試。C++Test靜態(tài)測(cè)試部分包含了很多典型行業(yè)規(guī)范,有BugDetective、EffectiveC++、GJB5369、MISRAC2004、MISRAC++2008等。C++Test還提供RuleWizard用戶自定義規(guī)則功能。C++Test的靜態(tài)測(cè)試具有基于數(shù)據(jù)流和基于模式的兩種分析技術(shù)?;跀?shù)據(jù)流的靜態(tài)測(cè)試分析技術(shù)也被稱為BugDetective。BugDetective模擬和識(shí)別代碼中復(fù)雜路徑,搜索并定義可疑點(diǎn),進(jìn)而暴露可能觸發(fā)運(yùn)行時(shí)缺陷的路徑。特別是針對(duì)遺留代碼庫(kù)和嵌入式代碼的運(yùn)行時(shí)檢測(cè)效果較差的情況,BugDetective可以無(wú)需測(cè)試用例和執(zhí)行代碼就發(fā)現(xiàn)除數(shù)為零、內(nèi)存和資源泄露、空指針引用等運(yùn)行時(shí)缺陷,而這些軟件錯(cuò)誤很多是基于模式的靜態(tài)分析技術(shù)不易檢測(cè)到的。C++test提供的可視化、易操作的靜態(tài)測(cè)試完全可以勝任嵌入式軟件的靜態(tài)測(cè)試工作。
3.2FortifySCA(FortifySourceCodeAnalysis)
FortifySCA是Fortify360系列產(chǎn)品中的靜態(tài)代碼分析器,旨在檢測(cè)源代碼中存在的安全漏洞。FortifySCA有全面的安全編碼規(guī)則,提供最新的安全編碼規(guī)則包下載來(lái)應(yīng)對(duì)新的安全漏洞,用戶還可以自定義安全規(guī)則。具有數(shù)據(jù)流、語(yǔ)義、結(jié)構(gòu)、控制流、配置流等分析引擎。支持C/C++、Java、JavaScript、.NET、PHP等20多種語(yǔ)言,支持Windows、Linux、Unix等操作平臺(tái)和多種編譯器,以及提供Eclipse、VisualStudio等IDE的插件。該工具分析源代碼分為三個(gè)步驟:轉(zhuǎn)換、掃描與分析、校驗(yàn)。轉(zhuǎn)換:源代碼關(guān)聯(lián)一個(gè)BuildID,創(chuàng)建中間文件。掃描與分析:掃描中間文件,分析源代碼,將檢測(cè)結(jié)果寫入FPR文件。校驗(yàn):驗(yàn)證所有源文件依據(jù)正確的規(guī)則包被掃描。但是其本身是商業(yè)軟件,價(jià)格昂貴。FortifySCA提供掃描方式:IDE插件掃描、命令行、AuditWorkbench(FortifySCA圖形用戶界面)掃描。例如想要掃描一個(gè)VisualStudio項(xiàng)目FreeBird,此時(shí)就可以用下列語(yǔ)句:sourceanalyzer-bFreeBirddevenvFreeBird.sln/REBUILDsourceanalyzer-bFreeBird-scan-fFreeBird.fprFreeBird是項(xiàng)目名,devenv表示visualstudio的可執(zhí)行程序,/REBUILD是devenv命令參數(shù)。
2.3PC-Lint
PC-Lint是GIMPELSOFTWARE公司開發(fā)的C/C++軟件代碼靜態(tài)分析工具,側(cè)重于代碼的邏輯分析。PC-Lint的歷史可以追溯到1979年貝爾實(shí)驗(yàn)室開發(fā)的靜態(tài)代碼分析工具Lint。而Lint起初是UNIX系統(tǒng)工具,后來(lái)衍生了Linux系統(tǒng)發(fā)行版本Splint和Windows系統(tǒng)發(fā)行版本PC-Lint。PC-Lint支持大多數(shù)流行編譯環(huán)境和編譯器。PC-Lint采用命令行和開發(fā)環(huán)境插件集成兩種方式。PC-Lint的基本命令行的形式為:c:\lint\lint-nt.exe-i"c:\lint"-ustd.lnt"d:\FreeBird\*.cpp"lint-nt.exe是PC-Lint在Windows下的可執(zhí)行程序,-i"c:\lint"表示查找到配置文件*.lnt的路徑,-ustd.lnt指明使用的那些配置文件,"d:\FreeBird\*.cpp"表示要測(cè)試的目標(biāo)文件。每個(gè)編號(hào)對(duì)應(yīng)信息可以通過PC-Lint安裝包中msg.txt文檔進(jìn)行查閱。
2.4CppCheck
CppCheck是針對(duì)C/C++的檢測(cè)非語(yǔ)法錯(cuò)誤的開源靜態(tài)檢測(cè)工具。一般作為編譯器或者其他靜態(tài)檢測(cè)工具的補(bǔ)充。支持命令行、插件版、獨(dú)立版三種檢測(cè)代碼缺陷方式。其中獨(dú)立版操作較其他工具簡(jiǎn)單。報(bào)告類別為:錯(cuò)誤、警告、風(fēng)格警告、可移植性警告、性能警告、信息消息。CppCheck的基本命令行的形式為:cppcheck--enable=all"d:\FreeBird\*.cpp"--enable=all表示全部啟用以上6種報(bào)告類型,"d:\FreeBird\*.cpp"表示要測(cè)試的目標(biāo)文件。
2.5Coverity
三、結(jié)束語(yǔ)
嵌入式系統(tǒng)是計(jì)算機(jī)技術(shù)、現(xiàn)代網(wǎng)絡(luò)與通信技術(shù)、自動(dòng)控制技術(shù)等高度融合的產(chǎn)物。嵌入式系統(tǒng)適應(yīng)于對(duì)功能、可靠性、體積、功耗、成本等綜合指標(biāo)具有嚴(yán)格要求的專業(yè)計(jì)算機(jī)應(yīng)用系統(tǒng)。目前,嵌入式系統(tǒng)已經(jīng)在我們的生活和工作中得到廣泛的應(yīng)用。隨著嵌入式處理器和硬件技術(shù)的快速度發(fā)展,開發(fā)實(shí)時(shí)嵌入式系統(tǒng)產(chǎn)品的復(fù)雜程度也在日益提高。在該類產(chǎn)品的開發(fā)過程中,一個(gè)重要環(huán)節(jié)是對(duì)嵌入式軟件的嚴(yán)格測(cè)試;為此對(duì)嵌入式軟件的測(cè)試方法進(jìn)行研究具有十分重要的現(xiàn)實(shí)意義。
參考文獻(xiàn):
[1] 嵌入式計(jì)算機(jī)系統(tǒng)的發(fā)展與展望[J].于子萍.硅谷.2017(16)
[2] 嵌入式系統(tǒng)仿真研究[J].王曉華,顧逸東,陳蔚薇,張濤.微計(jì)算機(jī)信息.2018(16)
[3] 嵌入式軟件可靠性仿真測(cè)試環(huán)境框架[J].王軼辰,劉斌,阮鐮.計(jì)算機(jī)工程.2016(19)
(作者單位:珠海格力電器股份有限公司)