我可以选择禁用这两个MISRA规则:每个函数一个语句和强制函数原型吗?

时间:2017-10-03 19:00:08

标签: c misra

我们公司现在是ISO-13485(医疗设备),并希望使用MISRAC2012。我阅读了标准,但如果我认为可以提高稳定性和可读性,我无法弄清楚是否可以禁用某些规则。

两个例子:

MISRA每个函数只允许1个return语句。这通常会导致嵌套的条件结构看起来像圣诞树。我真的不认为这条规则会增加安全性,因为它会降低代码的可读性并且更容易出错。

MISRA只接受具有原型的函数,即使对于静态函数也是如此。这允许程序员将其功能放在文件中的任何位置而不考虑调用顺序。没有原型,main函数必须是文件中的最新函数,并且多函数递归是不可能的,因为函数只能调用上面声明的函数。

如果我想禁用这两条规则,我可以这样做吗?有客户会因此而责怪我吗?

3 个答案:

答案 0 :(得分:5)

MISRA-C:2012有3个类别,所有指令和规则排序:

  • 强制性。您必须遵循这些并且不允许您做出偏差。
  • 必需。你必须遵守这些规则,但如果你提出正式偏离规则,你可以打破它们。你需要一个很好的理由。
  • 咨询。建议遵循这些,但你可以打破它们而不会产生正式的偏差(虽然建议做出偏差)。

偏差背后的想法是你的公司应该有一个处理它们的例程,例如内部质量差事或在代码审查会议期间提出的事情等。这个想法是除了你自己以外的其他人必须参与创造偏差的过程,最好是具有广泛C知识的人。这在MISRA-C 5.4中有描述,还有一个名为MISRA Compliance:2016的附加指导文件可能会有所帮助。

我个人对如何实施偏差的建议是根据具体情况不允许这些偏差。相反,应该为公司建立单独的编码标准文档 - 无论如何,您需要某种方式的文档来声明MISRA合规性。此文档应包含所有公司范围的偏差的列表。如果需要偏离,则必须更新公司范围的文档。这实际上可以帮助你避免实施大量的官僚程序,它可以让你从各种经验不足的程序员那里得出奇怪的想法,只是因为他们不了解MISRA-C规则的理由。

至于每个函数的一个return语句,在我看来是known defect in MISRA-C inherited from IEC 61508(我认为我是唯一一个真正困扰研究需求来源的人)。你应该对规则提出永久性的偏差,因为这是无稽之谈。我个人改述了这个要求,因为#34;函数不应该有多个return语句,除非有几个return语句导致更可读的代码"。这涵盖了规则的真正意图,即避免意大利面条编程。

  

MISRA只接受具有原型的函数,即使对于静态函数也是如此。这允许程序员将其功能放在文件中的任何位置而不考虑调用顺序。没有原型,main函数必须是文件中的最新函数,并且多函数递归是不可能的,因为函数只能调用上面声明的函数。

我不相信这有任何意义,似乎你正试图解决一个不存在的问题。你应该避免意外的递归1)实际知道你在做什么,2)使用静态分析工具,按照MISRA的要求。

如果您希望调用堆栈为func1() - > func2() - > func3()和来自调用func1()的块func2()或func3(),这可以通过适当的程序设计得到最好的解决。赋予功能直观的名称和使用常识将使您走得更远。

如果这还不够,那么您可以将翻译单元拆分为两个,并为内部创建单独的h / c文件对。如果您有很长的源文件,其中包含很多函数,那么您描述的风险主要是一个问题,直到程序员失去对它们的追踪。这也是一个很好的迹象,表明文件(和/或函数)应该分成几个。

至于这个MISRA规则背后的理由,它是一个非常合理的,即阻止旧的C90垃圾发明"调用约定(隐式int返回类型,组成参数等),只是因为编译器无法找到函数原型。你绝对不应该偏离这条规则。

答案 1 :(得分:2)

规则15.5(一个函数最后应该有一个退出点)是一个咨询规则。因此,如果您的内部流程如此记录,您可以拒绝此规则。

规则8.2(函数应为原型形式)是必需规则,对于(IMHO)声音原因 - 它确保您明确定义函数返回所有参数的类型,数量和类型,从而避免未定义的行为。

如果你愿意,你可以偏离指南,但这需要你证明这个决定的合理性!

答案 2 :(得分:1)

您可以遵循偏差过程,并且该过程的一部分是由合格的技术人员审查偏差。偏差可以涵盖不合规的个别情况,也可以在整个项目范围内。

那么您如何证明您要求的项目范围的偏差?

我认为,应该审查每个违规行为。在某些情况下,你的推理,例如,深度嵌套可能是不可读/不可维护的,必须先考虑为什么它们首先如此深入?换句话说,功能可能做得太多,需要分解成更小的模块 我假设您正在使用静态分析工具,该工具非常智能,可以在偏差得到批准后提供不报告违规行为的方法。