为什么“继续”在MISRA C:2004中被视为C违规?

MISRA 14.5表示不得使用继续声明。 任何人都可以解释原因吗? 谢谢。

正是因为关于goto ,无条件分支和意大利面条代码的古老争论已经持续了40年左右。 gotocontinuebreak和多个return语句都被认为或多或少同样糟糕。

世界编程社区的共识大致结束了这样的事情:我们认识到如果你知道自己在做什么,就可以使用语言的这些function,而无需编写意大利面条代码。 但是我们仍然不鼓励他们,因为很有可能一个不知道他们正在做什么的人会在可用的情况下使用这些function,然后创建意大利面条。 我们也不鼓励他们,因为它们是多余的function:显然你可以在不使用它们的情况下编写程序。

由于MISRA-C针对关键系统,MISRA-C:2004的方法是尽可能多地禁止这些无条件分支function。 因此,禁止gotocontinue和多次退货。 只有在同一循环中有一个break时才允许中断。

然而 ,在目前正在评估的“MISRA-C:2011”草案中,委员会已经考虑再次允许所有这些function,并且限制只允许goto向下跳跃且永不向上。 委员会的理由说,现在有工具(即静态分析仪)足够聪明,可以发现不良的程序流,因此可以允许关键字。

goto辩论仍然很激烈……

用C编程使得跟踪多个执行分支变得非常困难。 如果您在某处分配资源,则必须在其他位置(非本地)释放它们。 如果您的代码分支,您通常需要为每个分支或退出范围的方式分别设置释放逻辑。

continue语句添加了另一种退出for循环范围的方法,因此使得这样的循环更难以推理并理解控制可以通过它的所有可能方式,这反过来又使得更难以确定代码在所有情况下都能正常运行。

这只是我的猜测,但我认为试图限制来自这种额外分支行为的复杂性是你提到的规则的驱动原因。

与所有MISRA规则一样,如果您可以certificate这一点,您可以偏离规则(MISRA-C:2004第4.3.2节)

MISRA(以及其他类似指南)背后的要点是捕获通常会导致问题的事情……是的, continue可以正确使用,但证据表明它是问题的常见原因。

因此,MISRA制定了一项规则来防止其(ab)使用,审查社区批准了该规则。 用户社区的观点通常支持该规则。

但我再说一遍,如果你真的想要使用它,并且你可以certificate它适用于你的公司层级,那就偏离了。