出處汽車工業(yè)軟件可靠性聯(lián)會_第1頁
出處汽車工業(yè)軟件可靠性聯(lián)會_第2頁
出處汽車工業(yè)軟件可靠性聯(lián)會_第3頁
出處汽車工業(yè)軟件可靠性聯(lián)會_第4頁
出處汽車工業(yè)軟件可靠性聯(lián)會_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、MISRA 2004規(guī)則Jerry整理出處:汽車工業(yè)軟件可靠性聯(lián)會最后更新時間:2005-7-20轉(zhuǎn)載請注明:來自Sawin系統(tǒng)分析之窗MISRA (The Motor Industry Software Reliability Association 汽車工業(yè)軟件可靠性聯(lián)會) 是位于英國的一個跨國汽車工業(yè)協(xié)會,其成員包括了大部分歐美汽車生產(chǎn)商。其核心使命是為汽車工業(yè)提供服務和協(xié)助,幫助廠方開發(fā)安全的、高可靠性的嵌入式軟件。這個組織最出名的成果是所謂的MISRA C Coding Standard,這一標準中包括了127條C語言編碼標準,通常認為,如果能夠完全遵守這些標準,則你的C代碼是易讀、

2、可靠、可移植和易于維護的。最近很多嵌入式開發(fā)者都以MISRA C來衡量自己的編碼風格,比如著名的uC/OS-II就得意地宣稱自己99遵守MISRA標準。而嵌入式開發(fā)雜志也專門載文號召大家學習。編碼規(guī)范通常是一個公司自定的“土政策”,居然有人去做標準,而且還得到廣泛的認可,這不禁引起我強烈的興趣??上н@份標準的文本需要花錢去買,而且短短幾十頁,要價非常昂貴。MISRA在網(wǎng)上公布了一些文檔,其中有關(guān)于MISRA C Coding Standard的Clarification報告,從中間你可以大致猜到MISRA標準本身是什么。我仔細閱讀了這些文檔,并且通過閱讀其他一些介紹性文檔,大致了解了MISRA

3、標準的主要內(nèi)容。這些條款確有過人之處,對于C/C+語言工程項目的代碼質(zhì)量管理能夠起到良好的指導性作用,對于大部分軟件開發(fā)企業(yè)來說,在MISRA的基礎(chǔ)上適當修改就可以形成自己的規(guī)范。當然其中也有一些過于嚴苛的東西,這就需要各個開發(fā)部門靈活處理了。我個人的體會,編碼規(guī)范雖然很簡單,但是要完全執(zhí)行,不折不扣,需要開發(fā)部門有很高的組織性和紀律性,并且有很好的代碼評審機制。因此,如果能夠嚴格地遵守編碼規(guī)范,本身就是一個開發(fā)部門實力的證明。內(nèi)容<環(huán)境>Rule1.1(強制):所有的代碼應該遵守ISO 9899:1990“Programming Language C

4、”Rule1.2(強制):只有當具備統(tǒng)一接口的目標代碼的時候才可以采用多種編譯器和語言Rule1.4(強制) 檢查編譯器/連接器以確保支持31一個有效字符,支持大小寫敏感<語言擴展>Rule 2.1(強制):匯編語言應該封裝起來并且隔離:例如:#define NOP asm(“  NOP”)Rule 2.2(強制) :源代碼只能采用/*/風格的注釋Rule2.3(強制): 字符序列/*不能在注釋中使用注:C語言不支持注釋的嵌套即使一些編譯器支持這個語言擴展Rule 2.4(建議):代

5、碼段不能注釋掉注:應采用#IF 或者#ifdef來構(gòu)成一個注釋,否則代碼里如果有注釋會改變代碼的作用<文檔化>Rule 3.3(建議):編譯器對于整數(shù)除法運算的實施應該寫入文檔例編譯器:-5/3 = -1 余-2 有些編譯器結(jié)果是-2于1<字符集>Rule 4.1(強制):只能使用ISO標準定義的字符集<標識符>Rule6.5 (強制):在內(nèi)部范圍的標識符不能和外部的標識符用同樣的名字,因為會隱藏那個標識符例:Int16_t i:Void f()int16_t

6、 I;i=3;Rule 5.2(強制): typedef 名稱只能唯一,不能重復定義Rule 5.4(強制): 標記名應該是唯一的標識符Rule 5.7(建議):標識符不能重復使用<類型>Rule 6.1(強制):Char類型只能用來存儲使用字符Rule 6.2(強制):signed和unsigned char 只能用來存儲和使用數(shù)據(jù)值Rule6.3(建議)對于基本的類型使用Typedef來表示大小和有無符號例:Typedef char char_tTy

7、pedef signed int int32_t <約束>Rule 7.1(強制):不要用八進制數(shù)注:整型常數(shù)以”0“開始會被認為是8進制例:code1=109        code2=100        code3=052        code4=071如果是對總線消息初始化,會有危險<聲明和定義>Rule

8、 8.1(強制):函數(shù)都應該有原型聲明,且相對函數(shù)定義和調(diào)用可見Rule8.2 (強制):無論何時一個對象和函數(shù)聲明或者定義,它的類型應該明確聲明Rule 8.5(強制):頭文件中不要定義對象或者函數(shù)Rule8.3(強制):每個函數(shù)聲明中的參數(shù)的類型應該和定義中的類型一致Rule 8.8(強制):外部變量或者函數(shù)只能聲明在一個文件中注:一般來講,聲明在頭文件中,然后包含在定義和使用的文件中Rule 8.12(強制):數(shù)組聲明為外部,應該明確聲明大小或者直接初始化確定例:extern int array2  

9、; /* 違反Rule8.8 */<初始化>Rule 9.1(強制):所有變量在使用之前都應該賦值<數(shù)學類型轉(zhuǎn)換(隱式)>Rule 10.1(強制):整型表達式不要隱式轉(zhuǎn)換為其他類型:    a)轉(zhuǎn)換到更大的整型    b)表達式太復雜    c)表達式不是常數(shù)是一個函數(shù)    d)表達式不是一個常數(shù)是一個返回表達式Rule 10.2(強制):浮點數(shù)表達

10、式不要隱式轉(zhuǎn)換為其他類型:    a)轉(zhuǎn)換到更大的浮點數(shù)    b)表達式太復雜    c)表達式是一個函數(shù)    d)表達式是一個返回表達式<數(shù)學類型轉(zhuǎn)換(明確)>Rule 10.3(強制):整型表達式的值只能轉(zhuǎn)換到更窄小且是同樣符號類型的表達式Rule 10.4(強制):浮點表達式的值只能轉(zhuǎn)換到更窄小的浮點表達式<數(shù)學類型轉(zhuǎn)換>Rule 10.6(強制):所有的 uns

11、igned類型都應該有后綴”U“Rule 11.1(強制):指針不能轉(zhuǎn)換為函數(shù)或者整型以外的其他類型<表達式>Rule12.2(強制):表達式的值應和標準允許的評估順序一致例:X=bi + i+;不同的編譯器給出的結(jié)果不一樣,bi是否先執(zhí)行?應:x=bi;       i+;比如:X=func(i+,i);Rule12.3(強制):sizeof操作符不能用在包含邊界作用(side effect)的表達式上例:Int32_t=i;Int32_t=j;j=sizeof(i=12

12、34);表達式并沒有執(zhí)行,只是得到表達式類型int的sizeRule 12.4(強制):邏輯操作符&&或者|右邊不能包含邊界作用(side effect)例:If(ishight) && (x= i+),如果ishight0那么i+不會評估Rule 12.3(建議):+和- -不能和其他表達式用在一個表達式中例:U8a=+u8b + u8c-;<控制語句表達式>Rule13.1(強制):賦值語句不能用在一個產(chǎn)生布爾值的表達式中例:If(x=y)!=0)更差:If

13、 (x=y)Rule13.3(強制):浮點表達式不應該測試其是否相等或者不相等Rule13.4(強制):for控制表達式中不要包含任何浮點類型Rule13.6(強制):數(shù)字變量作為for循環(huán)的循環(huán)計數(shù)不要在循環(huán)體內(nèi)部被修改例:Flag=1;For(i=0;(i<5)&&(flag=1);i+)Flag=0;i=i+3;<控制流>Rule 14.1(強制):不要有執(zhí)行不到的代碼例:Swich(event)Case www;         &#

14、160;do_wakeup();          break;          do_more();Rule 14.4(強制):goto語句不能使用Rule 14.5(強制):continue不能使用Rule 14.6(強制):函數(shù)應在函數(shù)結(jié)束有一個出口Rule 14.7(強制):witch,while,do .while,for語句體應是一個

15、混合語句(括號)Rule 14.10(強制):所有ifelse if結(jié)構(gòu)都應該由else結(jié)束<Switch語句>Rule 15.3(強制):switch的最后應是defaultRule 15.4(強制):switch表達式不能使用布爾表達式例:Switch(x=0) Rule 15.5(強制):每一個Switch語句都應該有一個case例:Switch(x)Uint8_t var; /* 違反*/Case 0:A=b;<函數(shù)>Rule16.2(強制):函數(shù)不能直接或者間接

16、的調(diào)用自己注:safe-related 系統(tǒng)不能用遞歸,超出堆??臻g很危險Rule16.8(強制):non-void類型函數(shù)的所有出口路徑都應該有一個明確的return語句表達式<指針和數(shù)組>Rule17.1(強制):指針的數(shù)學運算只能用在指向數(shù)組的地址上Rule17.3(強制):>,>=,<,<=不能用在指針類型除非指向同一個數(shù)組Rule 17.5(建議):不要用2級以上指針<結(jié)構(gòu)和聯(lián)合>Rule18.4(強制)不要用Union<預處理指令>Rule19.1(建議):i nclude語句的前面只能有其他預處理指令和注釋Rule19.2(建議):i nclude指令中的頭文件名稱不能包含非標準的字符Rule19.5(強制):宏不能在函數(shù)體內(nèi)定義Rule19.8(強制):類函數(shù)宏調(diào)用時不能沒有它的參數(shù)<標準庫>Rule20.1(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論