MISRAC2012规则15.4并用break替换goto
关于 MISRA C 2012 规则 15.4 -“用于终止任何迭代语句的 break 或 goto 语句不应超过一个。” - 这个例子正确吗?任何人都可以用一些工具(MISRA 检查器)确认这一点吗?
do {
retval = do_smth();
if (retval != OK) {
break;
}
retval = do_smth2();
if (retval != OK) {
break;
}
retval = do_smth3();
} while (0u);
这只是一个概念,但我在这里尝试的是goto用break. 我的观点是这do { } while(0u);不是迭代语句。
你认为呢?
回答
我会用这个替换你的代码:
retval = do_smth();
if (retval == OK) {
retval = do_smth2();
}
if (retval == OK) {
retval = do_smth3();
}
- 没有虚假的时候
- 没有伪装成休息的 goto
- 因此甚至没有一个 goto/break
- 因此不再有 MISRA 问题
- 奖励:比原始代码的行数减少一半
顺便说一句:break; // <- 3rd无论如何最后一次休息 ( ) 都没有用
- While this looks neat in this particular example, this will become burdensome and needlessly slow in case of extensive error checking. Keep in mind that in case of failure the program still has to execute a bunch of `if (retval == OK)` branches, which isn't ideal.