MISRA C 2004

引用原文:

https://blog.csdn.net/qq_20553613/article/details/81989570

 

以下爲MISRA C 2004規範標準。


<環境>
規則1.1(強制):所有的代碼應該遵守 ISO 9899:1990“Programming Language C”
規則1.2(強制):只有當具備統一接口的目標代碼的時候纔可以採用多種編譯器和語言。
規則1.4(強制):檢查編譯器 / 連接器以確保支持 31 一個有效字符,支持大小寫敏感。

<語言擴展>

Rule 2.1(強制):彙編語言應該封裝起來並且隔離。
例如:#define NOP asm( “NOP”)
規則2.2(強制):源代碼只能採用 /* …*/風格的註釋。
規則2.3(強制):字符序列 /* 不能在註釋中使用。
注:C 語言不支持註釋的嵌套即使一些編譯器支持這個語言擴展。
規則2.4(建議):代碼段不能註釋掉。
注:應採用 #if 或者#ifdef 來構成一個註釋,否則代碼裏如果有註釋會改變代碼的作用。

<文檔化>
規則3.3(建議):編譯器對於整數除法運算的實施應該寫入文檔。
例: -5/3 = -1 餘-2 有些編譯器結果是 -2 於+1。

<字符集>
規則4.1(強制):只能使用 ISO 標準定義的字符集。

<標識符>
規則6.5 (強制):在內部範圍的標識符不能和外部的標識符用同樣的名字,因爲會隱藏那個標識符。
例:

int16_t i: 
void f() 

    int16_t i; 
    i=3 ;

1
2
3
4
5
6
規則5.2(強制):typedef 名稱只能唯一,不能重複定義。
規則5.4(強制):標記名應該是唯一的標識符。
規則5.7(建議):標識符不能重複使用。

<類型>
規則6.1(強制):char 類型只能用來存儲使用字符。
規則6.2(強制):signed 和 unsigned char 只能用來存儲和使用數據值
規則6.3(建議):對於基本數據類型,必須使用typedef顯式標識出數據長度。
例:

typedef signed char int8_t;
typedef unsigned int uint16_t;
1
2

<約束>
規則7.1(強制):禁止使用八進制數(0除外)或者八進制轉義字符。
注:整型常數以 ”0開始會被認爲是八進制。
例:

code[1]=109 
    code[2]=100 
    code[3]=052 
1
2
3
如果是對總線消息初始化,會有危險。

<聲明和定義>
規則8.1(強制):函數都應該有原型聲明,且相對函數定義和調用可見。
規則8.2(強制):無論何時一個對象和函數聲明或者定義,它的類型應該明確聲明 。
規則8.3(強制):函數聲明中的參數類型應該和定義中的類型一致。
規則8.4(強制):如果對象或函數被聲明瞭多次,那麼它們的類型應該是兼容的。
規則8.5(強制):頭文件中不應定義對象或者函數。
規則8.6(強制):函數應該聲明爲具有文件作用域。
規則8.7(強制):如果對象的訪問只是在單一的函數中,那麼對象應該在塊範圍內聲明。
規則8.8(強制):外部變量或者函數只能聲明在一個文件中。
規則8.9(強制):具有外部鏈接的標識符應該具有準確的外部定義。
規則8.10(強制):在文件範圍內聲明和定義的所有對象或函數具有內部鏈接,除非是在需要外部鏈接的情況下。
規則8.11(強制):static存儲類標識符應該用於具有內部鏈接對象和函數的定義和聲明。
規則8.12(強制):數組聲明爲外部,應該明確聲明大小或者直接初始化確定。

<初始化>
規則9.1(強制):所有變量在使用之前都應該賦值。
規則9.2(強制):應該使用大括號一指示和匹配數組和結構的非零初始化構造。
規則9.3(強制):在枚舉列表中,”=“不能顯式用於除首元素之外的元素上,除非所有的元素都是顯式初始化的。

<數學類型轉換(隱式)>
規則10.1(強制):整型表達式不要隱式轉換爲其他類型。
  1)轉換到更大的整型。
 2)表達式太複雜。
  3)表達式不是常數是一個函數。
 4)表達式不是一個常數是一個返回表達式。
規則10.2(強制):浮點數表達式不要隱式轉換爲其他類型。
  1)轉換到更大的浮點數。
  2)表達式太複雜。
 3)表達式是一個函數。
 4)表達式是一個返回表達式。

<數學類型轉換(明確)>
規則10.3(強制):整型表達式的值只能轉換到更窄小且是同樣符號類型的表達式。
規則10.4(強制):浮點表達式的值只能轉換到更窄小的浮點表達式。
規則10.5(強制):如果位運算~和<<應用在基本類型爲unsigned char 或unsigned short的操作數,結果應該立即強制轉換爲預期操作數的基本類型。
例:

uint8_t a = 0x5a;
uint8_t b;
b = ((uint8_t)(~a))>>4;
1
2
3

<數學類型轉換 >
規則10.6(強制):所有的 unsigned 類型都應該有後綴“U”。
規則11.1(強制):指針不能轉換爲函數或者整型以外的其他類型。

<表達式>
規則12.2(強制):表達式的值應和標準允許的評估順序一致。
例:
x=b[i] + i++;
不同的編譯器給出的結果不一樣,b[i] 是否先執行?
應:x=b[i];
i++;
比如:
x=func(i++,i);

規則12.3(強制):sizeof 操作符不能用在包含邊界作用(side effect) 的表達式上。
例:
int32_t=i;
int32_t=j;
j=sizeof(i=1234);
表達式並沒有執行,只是得到表達式類型int的size。

規則12.4(強制):邏輯操作符 && 或者||右邊不能包含邊界作用 (side effect)。
例:
if(ishight) && (x== i++)), 如果 ishight =0 那麼 i++不會評估

規則12.5(建議):++和- - 不能和其他表達式用在一個表達式中。
例:

u8a=++u8b + u8c–;

<控制語句表達式>
規則13.1(強制):賦值語句不能用在一個產生布爾值的表達式中。
例:
if((x=y)!=0) …
if (x=y) …
規則13.3(強制): 浮點表達式不應該測試其是否相等或者不相等。
規則13.4(強制):for控制表達式中不要包含任何浮點類型。
規則13.6(強制):數字變量作爲for循環的循環計數不要在循環體內部被修改。
例:

flag=1; 
for(i=0;(i<5)&&(flag==1);i++) 

flag=0; 
i=i+3; 

1
2
3
4
5
6

<控制流>
規則14.1(強制):不要有執行不到的代碼。
例:

swich(event) 

case 0; 
      do_wakeup(); 
      break; 
      do_more(); 
… 

1
2
3
4
5
6
7
8
規則14.4(強制) :goto 語句不能使用。
規則14.5(強制):continue 不能使用。
規則14.6(強制): 函數應在函數結束有一個出口。
規則14.7(強制):witch、while do 、while for 語句體應是一個混合語句。
規則14.10(強制): 所有if else if 結構都應該由 else 結束。


switch(x) 

uint8_t var; /* 違反*/ 
case 0:  
… 

1
2
3
4
5
6

<函數>
規則16.2(強制): 函數不能直接或者間接的調用自己。
例:系統不能用遞歸,超出堆棧空間很危險。
規則16.8(強制):non-void 類型函數的所有出口路徑都應該有一個明確的return 語句表達式。

<指針和數組>
規則17.1(強制):指針的數學運算只能用在指向數組的地址上。
規則17.3(強制):>,>=,<,<= 不能用在指針類型,除非指向同一個數組。
規則17.5(建議):禁止使用 2 級以上指針。

<結構和聯合>
規則18.4(強制):禁止使用union(共用體)。

<預處理指令>
規則19.1(建議):#include 語句的前面只能有其他預處理指令和註釋。
規則19.2(建議):#include 指令中的頭文件名稱不能包含非標準的字符。
規則19.5(強制):宏不能在函數體內定義。
規則19.8(強制):類函數宏調用時不能沒有它的參數。

<標準庫>
規則20.1(強制):標準庫中的保留標識符,宏和函數不能定義,重定義和undefined。
規則20.4(強制):動態內存分配不能使用。
例:不能使用malloc、calloc、free、realloc。
規則20.9(強制):輸入輸出庫 (stdio.h) 不能用在產生嵌入式系統中。
規則20.12(強制):時間處理函數 time.h不能使用。

<運行時故障>
規則21.1(強制):通過使用以下手段確保把運行時故障最小化。
 1)靜態分析工具/技術。
 2)動態分析工具/技術。
 3)編寫明確的代碼避免運行時錯誤。
————————————————
版權聲明:本文爲CSDN博主「Acuity-」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_20553613/article/details/81989570

發佈了16 篇原創文章 · 獲贊 120 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章