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

C 我是否可以选择禁用这两个MISRA规则:每个函数一条语句和强制函数原型?,c,misra,C,Misra,我们公司现在是ISO-13485(医疗器械),希望使用MISRAC2012。我阅读了该标准,但如果我认为它可以提高稳定性和可读性,我无法确定是否允许禁用某些规则 两个例子: MISRA只允许每个函数有一个返回语句。这通常会导致嵌套的条件结构看起来像圣诞树。我真的不认为这个规则增加了安全性,因为它使代码可读性降低,更容易出错 MISRA只接受有原型的函数,即使是静态函数。这允许程序员将其函数放置在文件中的任何位置,而不考虑调用顺序。没有原型,主函数必须是文件中最新的函数,而多函数递归是不可能的,因

我们公司现在是ISO-13485(医疗器械),希望使用MISRAC2012。我阅读了该标准,但如果我认为它可以提高稳定性和可读性,我无法确定是否允许禁用某些规则

两个例子:

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

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


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

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

那么,您将如何证明您所要求的项目范围内的偏差

我最多只能说,每一项违反行为都应该得到审查。在某些情况下,您的推理,例如,深嵌套可能无法读取/无法维护,必须通过一个问题来权衡,为什么它们一开始就那么深?换句话说,可能函数做得太多,需要分解成更小的模块。

我假设您使用的是一个静态分析工具,它足够聪明,能够提供一种方法,一旦偏差得到批准,就不会继续报告违规行为。

MISRA-C:2012有三个类别,所有指令和规则都在这三个类别下排序:

  • 强制性的。你必须遵守这些规定,不允许有任何偏差
  • 必需的。您必须遵守这些规则,但如果您提出正式的规则偏差,您可以违反这些规则。你需要一个很好的理由
  • 咨询。建议遵循这些原则,但您可以在不提出正式偏差的情况下打破这些原则(尽管提出偏差是推荐的做法)
偏差背后的想法是,您的公司应该有一个处理偏差的常规,例如内部质量差事或在代码审查会议期间提出的问题等。这个想法是,除了您自己之外,其他人必须参与创建偏差的过程,最好是具有广泛C知识的人。MISRA-C 5.4中描述了这一点,另外还有一个名为“这可能会有帮助”的指导文件

我个人对如何实施偏差的建议是,在个案基础上,根本不允许出现偏差。相反,应该为该公司建立一个单独的编码标准文档——无论如何,您需要某种形式的文档来声明MISRA合规性。本文件应包含公司范围内所有偏差的清单。如果需要偏离,则必须更新公司范围内的文件。这实际上避免了你执行很多官僚程序,也避免了你遇到各种经验不足的程序员提出奇怪的想法,仅仅因为他们不理解MISRA-C规则的基本原理


至于每个函数的一个返回语句,我认为是a(我想我是唯一一个真正费心研究需求来自何处的人)。你应该对这条规则提出永久性的背离,因为这是胡说八道。就我个人而言,我将该要求重新表述为“函数不应该有多个返回语句,除非多个返回语句导致更可读的代码”。这涵盖了该规则的真正意图,即避免意大利面编程


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

我不相信这有任何意义,好像你在试图解决一个根本不存在的问题。根据MISRA的要求,您应该通过1)实际知道自己在做什么和2)使用静态分析工具来避免意外递归

如果希望调用堆栈为func1()->func2()->func3(),并阻止func2()或func3()调用func1(),最好通过正确的程序设计来解决。赋予函数直观的名称并使用常识将使您走得更远

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

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

规则15.5(函数末尾应该有一个单点退出)是一条建议规则。因此,如果您的内部流程如此记录,您可以不遵守此规则

规则8.2(函数应为原型形式)是一个必需的规则,因为(IMHO)是合理的,因为它确保您明确定义函数返回类型以及所有参数的数量和类型,从而避免