MISRA C指導指南解讀系列6(MISRA C規則46-67)

2.1.            表達式

46.在標準的允許下,在任何賦值序列的情況下表達式的值應該一樣(R

       該規則的目的是避免由表達式引起的對變量的邊緣影響。

       例如:

              int myfunc()

{

       int i = 1;

       int a = 2;

 

       a = (i++) + (i--); /* 與規則衝突 */

}

       47.在C語句的處理過程中,通過添加非依賴性的標識來而不是採用C的默認處理順序(A

              另外,還要避免C語句過長,從而增加閱讀的難度係數。

              例如

                     x = (a*5) + (b/6);

       48.混合精度的數學表達式應該採用顯示的數據轉換產生期望的結果。(A

       49.對於不使用0的值應該明顯檢查,除非操作是針對布爾型(A

              例如:

                     float a = 0.0;

                     float b = 1.0;

                     float c = 0.0;

 

                     c = b/a;  /* 與規則49衝突*/

       50.浮點變量不應該採用準確的等於或不等於進行比較(R

              例如:

              float a = 1.0, b = 2.0;

              float c = 1.0;

 

              if (a == c) { … } /* 與規則衝突 */

              if (a != b ) {….} /* 與規則衝突 */

       51.常數無符號整型表達式的賦值應該不會引起wrap-around(A)

              #if (1u – 2u)  /* 違反規則 */

              …..

              #endif

2.2.            控制流

52.不存在無法被執行到的代碼(R

53.所有的非空句子應該具有邊緣影響(R

       例如

       int a = 9;

       a = a; /* 違反規則 */

54.空語句只能單獨一行出現,並且不允許在該語句中有任何文本內容(R

55.除了Switch語句,不能出現任何LabelA

56.不能使用goto語句(R

57.不能使用continue語句(R

58.除非是要介紹switch語句,break語句不允許使用(R

59.由ifelse ifelsewhiledo…whilefor構成的句子應該用括號括起來(R

例如

       if a == b{

              a = 5; /* OK */

} else

       b = 5; /* 違反規則 */

       60.所有的if else if結構最後都要包含最終的else句子(A

61switch句子中,所有的非空case語句最後都要有break語句(R

       62.所有的switch句子都應該包含一個最終的default句子(R

       63switch中的表達式不能表示一個布爾值(A

              例如

              switch (a == b) { /* 違反規則 63 */

                     case ….

}

       64.每一個switch語句至少有一個case句子(R

              例如

              switch(…) {

                     default: …; /* 違反規則 64 */

}

       65.浮點變量不能用作循環的計算器(R

       例如

              float i = 0.0;

              for(i = 0.0; i < 100.0; i += 1.0) { /* 違反規則 65*/

}

       66.在for語句中用於循環控制的只能是表達式(A

       例如

              int j = 0;

              for (j = 0; 1; j ++) {  /* 違反規則 66*/

                     ….

}

       67.用於for循環迭代計算的數值變量不能在循環體內被修改變量(A

              int j = 0;

              for (j = 0; j < 10; j ++) {

                     j = j+2; /* 違反規則 67*/

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章