DSP編程技巧之12-揭開編譯器神秘面紗之代碼規(guī)范MISRA-C
如果我們自己編寫了一個(gè)程序,程序能正常編譯,運(yùn)行起來也實(shí)現(xiàn)了我們期望的輸出,那是不是這個(gè)程序就很完善了呢?對(duì)于工業(yè)產(chǎn)品來說,“好”、“能用”和“完善”,或者說“標(biāo)準(zhǔn)”,甚至是代碼的“安全”,顯然不是一個(gè)層面的東西。因?yàn)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/C語言">C語言雖然是我們開發(fā)嵌入式應(yīng)用的最主要工具之一,然而C語言并非是專門為嵌入式系統(tǒng)設(shè)計(jì),相當(dāng)多的嵌入式系統(tǒng)較一般計(jì)算機(jī)系統(tǒng)對(duì)軟件安全性有更苛刻的要求;例如在那些對(duì)安全性要求很高的系統(tǒng)中,如飛行器、汽車和工業(yè)控制中,只要代碼的工作稍有偏差,就有可能造成重大的財(cái)產(chǎn)損失或者人員傷亡。
本文引用地址:http://www.ex-cimer.com/article/247057.htm那么如何衡量我們的代碼是否滿足某些標(biāo)準(zhǔn),是“安全的”、“健壯的”呢?此時(shí)我們就可以根據(jù)具體的應(yīng)用來查找相關(guān)的行業(yè)標(biāo)準(zhǔn)。舉個(gè)例子,在工業(yè)領(lǐng)域中,MISRA-C就是在的某些行業(yè)中要求遵守的行業(yè)標(biāo)準(zhǔn)。MISRA C是由汽車產(chǎn)業(yè)軟件可靠性協(xié)會(huì)(MISRA,motor industry software reliability association)提出的C語言開發(fā)標(biāo)準(zhǔn)。其目的是在增進(jìn)嵌入式系統(tǒng)的安全性及可移植性。針對(duì)C++語言也有對(duì)應(yīng)的標(biāo)準(zhǔn)MISRA C++。MISRA C一開始主要是針對(duì)汽車產(chǎn)業(yè):如果我們?nèi)⒓咏鼛啄甑挠嘘P(guān)汽車行業(yè)的基于自動(dòng)代碼生成技術(shù)和基于模型的設(shè)計(jì)技術(shù)的講座、研討會(huì)等等,無一例外都會(huì)聽到有關(guān)MISRA-C 2004,甚至是MISRA-C 2008、MISRA-C 2012等更新版本的介紹。此外,其他產(chǎn)業(yè)也已經(jīng)逐漸開始使用MISRA C:包括航空航天、電信、國(guó)防、醫(yī)療設(shè)備、鐵路等領(lǐng)域中都已有廠商使用MISRA C:這些領(lǐng)域無一不對(duì)代碼的規(guī)范,特別是代碼的安全有非常高的要求。MISRA C的第一版《Guidelines for the use of the C language in vehicle based software》是在1998年發(fā)行,一般稱為MISRA-C:1998.。MISRA-C:1998有127項(xiàng)規(guī)則,規(guī)則從1號(hào)編號(hào)到127號(hào),其中有93項(xiàng)是強(qiáng)制要求,其余的34項(xiàng)是推薦使用的規(guī)則。在2004年時(shí)發(fā)行了第二版的MISRA C的第一版《Guidelines for the use of the C language in critical systems》(或稱作MISRA-C:2004),其中有許多重要建議事項(xiàng)的變更,其規(guī)則也重新編號(hào)。MISRA-C:2004有141項(xiàng)規(guī)則,其中121項(xiàng)是強(qiáng)制要求,其余的20項(xiàng)是推薦使用的規(guī)則。規(guī)則分為21類,從“開發(fā)環(huán)境”到“運(yùn)行期錯(cuò)誤”。通常認(rèn)為,如果能夠完全遵守這些標(biāo)準(zhǔn),則你的C代碼是易讀、可靠、可移植和易于維護(hù)的。最近很多嵌入式開發(fā)者都以MISRA C來衡量自己的編碼風(fēng)格,比如著名的uC/OS-II就得意地宣稱自己99%遵守MISRA標(biāo)準(zhǔn)。目前有許多工具聲稱可以檢查代碼和MISRA規(guī)則相容性,不過MISRA沒有相關(guān)認(rèn)證的程序。相關(guān)工具可以幫助使用者評(píng)估和比較檢查的結(jié)果,也會(huì)提供一些可符合MISRA-C規(guī)定的指南,但是目前大部分的工具對(duì)靜態(tài)代碼分析的工具檢查基本能實(shí)現(xiàn),對(duì)動(dòng)態(tài)代碼分析則還不能完美實(shí)現(xiàn)。
考慮到MISRA-C:2004有141項(xiàng)規(guī)則,其中僅強(qiáng)制要求就有121項(xiàng),其余的20項(xiàng)是推薦使用的規(guī)則,顯然讓我們僅僅是把這么多規(guī)則瀏覽一遍就需要花費(fèi)大量的時(shí)間,更不用提手工對(duì)照規(guī)則來檢查我們的軟件了。幸好我們使用的DSP編程環(huán)境CCS提供了相應(yīng)的選項(xiàng),使得編譯器可以自動(dòng)檢查我們的代碼是否違反了MISRA-C的相關(guān)規(guī)則,并提供給我們?cè)敿?xì)的診斷與警告信息。
在C語言的標(biāo)準(zhǔn)ANSI C 和 ISO C之后,又產(chǎn)生了更新的C99以及最新的C11 (ISO/IEC 9899:2011),但是因?yàn)樽钚掳姹镜囊?guī)范從推出到各大編譯器廠家支持以及開發(fā)者的適應(yīng)都需要一定的時(shí)間,所以目前最常用的仍然是ANSI C或者C99。與此類似, 雖然MISRA-C的標(biāo)準(zhǔn)最弱已經(jīng)有最新的2012,但是人們談?wù)摵褪褂米疃嗟娜匀皇?004版本,所以在CCS的編譯器選項(xiàng)里仍以MISRC-C:2004的規(guī)則為準(zhǔn)。
啟用了--check_misra={all|required|advisory|none|rulespec}的選項(xiàng)使能MISRC-C:2004規(guī)則檢查之后,還可以在代碼中可以配合相關(guān)的預(yù)處理指令使能某些代碼的檢查/停止檢查功能,包括:
#pragma CHECK_MISRA ("{all|required|advisory|none|rulespec}");
#pragma RESET_MISRA ("{all|required|advisory|rulespec}");
其中,CHECK_MISRA用來使能或者禁止對(duì)MISRC-C:2004規(guī)則的檢查,它的作用與--check_misra是一致的。RESET_MISRA則用來復(fù)位MISRC-C:2004規(guī)則檢查的狀態(tài)。
rulespec參數(shù)則可以用來指定我們使用哪些MISRC-C:2004中的哪些規(guī)則來進(jìn)行特點(diǎn)的檢查,包括:
[-]X 使能 (或者禁止) X主題下各個(gè)規(guī)則的檢查。(主題包括變量、字符、初始化等)
[-]X-Z 使能 (或者禁止) 從X到Z主題下各個(gè)規(guī)則的檢查
[-]X.A 使能 (或者禁止) X主題下規(guī)則A的檢查。
[-]X.A-C 使能 (或者禁止) X主題下從規(guī)則A到規(guī)則C的檢查。
舉例說明:--check_misra=1-5,-1.1,8.2-4的含義是:
檢查從主題1到主題5的規(guī)則。(不清楚的網(wǎng)友可以去搜索MISRA規(guī)范,1.環(huán)境;2.語言擴(kuò)展;3.文檔;4.字符集;5.標(biāo)識(shí)符)
禁止規(guī)則1中1.1條目的規(guī)則(規(guī)則1.1(強(qiáng)制): 所有代碼都必須遵照ISO 9899:1990 “Programming languages - C”,由ISO/IEC 9899/COR1:1995,ISO/IEC 9899/AMD1:1995,和ISO/IEC9899/COR2:1996 修訂),規(guī)則1中的其它規(guī)則保持有效。
檢查主題8中的規(guī)則2到4.為了方便,我們可以列出這幾條規(guī)則的定義(其內(nèi)容較長(zhǎng),有興趣的網(wǎng)頁請(qǐng)?jiān)谒阉饕嬷袡z索):
主題8: 聲明與定義
規(guī)則8.2(強(qiáng)制): 不論何時(shí)聲明或定義了一個(gè)對(duì)象或函數(shù),它的類型都應(yīng)顯式聲明。
規(guī)則8.3(強(qiáng)制): 函數(shù)的每個(gè)參數(shù)類型在聲明和定義中必須是等同的,函數(shù)的返回類型也該是等同的。
規(guī)則8.4(強(qiáng)制): 如果對(duì)象或函數(shù)被聲明了多次,那么它們的類型應(yīng)該是兼容的。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)c語言相關(guān)文章:c語言教程
c++相關(guān)文章:c++教程
評(píng)論