☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

if 分枝中的语句应该用大括号括起来

9.1.14 ID_if_brace
目录 › next › previous

组成 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 子句不受本规则约束。

相关

ID_do_brace ID_for_brace ID_while_brace ID_switch_brace

参考

MISRA C 2004 14.9 MISRA C 2012 15.6 MISRA C++ 2008 6-4-1 SEI CERT EXP19-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.