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

now*_*wox 4 c misra

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

两个例子:

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

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

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

Lun*_*din 5

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

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

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

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


至于每个函数的一个return语句,我认为MISRA-C中的一个已知缺陷是继承自IEC 61508(我认为我是唯一一个真正困扰研究需求来源的人).你应该对规则提出永久性的偏差,因为这是无稽之谈.我个人将这个要求改为"函数不应该有多个return语句,除非有几个return语句导致代码更易读".这涵盖了规则的真正意图,即避免意大利面条编程.


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

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

如果你想让调用堆栈为func1() - > func2() - > func3()并从调用func1()中阻止func2()或func3(),那么最好用正确的程序设计来解决.赋予功能直观的名称和使用常识将使您走得更远.

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

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