禁止 goto 语句向嵌套的或无包含关系的作用域跳转
9.7.1 ID_forbidGotoBlocks
不同的作用域对应不同的条件约束,在不同的作用域间跳转是对约束的破坏,很容易导致逻辑混乱。
向嵌套的或无包含关系的作用域跳转是不应被允许的,如果是为了结束当前流程而在同层或向外层作用域跳转,则可被本规则允许。
示例:
int foo(int a) {
if (a == 0) {
goto L; // Non-compliant, jumps into a block
}
for (int i = 0; i < a; i++) {
for (int j = 0; j < a; j++) {
L:
if (cond) {
goto M; // Compliant, jumps out of loops
}
}
....
}
M:
return a;
}
例中 goto L 从 if 语句跳入循环语句是应当被禁止的,而 goto M 用于结束循环流程,可以保留。
相关
参考
MISRA C 2012 15.3
MISRA C++ 2008 6-6-1