if 分枝中的语句应该用大括号括起来
9.1.14 ID_if_brace
组成 if 分枝的语句应为大括号括起来的复合语句,即使该复合语句只包含一条语句。
示例:
if (cond1) // Non-compliant
if (cond2) // Non-compliant
action1();
else // Non-compliant
action2();
根据缩进,这段代码想表达的逻辑应是:
if (cond1) {
if (cond2) {
action1();
}
} else {
action2();
}
但 C/C++ 规定 else 子句与最近的 if 子句配对,所以实际逻辑是:
if (cond1) {
if (cond2) {
action1();
} else {
action2();
}
}
这显然是与预期不符的。
又如:
if (cond) // Non-compliant
y = 2;
else // Non-compliant
x = 3;
y = 1;
例中 y = 1; 看起来应该是 else 分枝的一部分,但它实际上并不在 else 的作用范围之内,所以用大括号括起来可避免此类问题:
if (cond) { // Compliant
y = 2;
} else { // Compliant
x = 3;
y = 1;
}
例外:
if (cond1) {
....
} else if (cond2) { // Compliant
....
}
直接与 if 语句相连的 else 子句不受本规则约束。
相关
参考
MISRA C 2004 14.9
MISRA C 2012 15.6
MISRA C++ 2008 6-4-1
SEI CERT EXP19-C