现在的位置: 首页 > 综合 > 正文

MISRA C指导指南解读系列6(MISRA C规则46-67)

2018年04月28日 ⁄ 综合 ⁄ 共 1864字 ⁄ 字号 评论关闭

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*/

}

 

抱歉!评论已关闭.