C 我是否可以选择禁用这两个MISRA规则:每个函数一条语句和强制函数原型?
我们公司现在是ISO-13485(医疗器械),希望使用MISRAC2012。我阅读了该标准,但如果我认为它可以提高稳定性和可读性,我无法确定是否允许禁用某些规则 两个例子: MISRA只允许每个函数有一个返回语句。这通常会导致嵌套的条件结构看起来像圣诞树。我真的不认为这个规则增加了安全性,因为它使代码可读性降低,更容易出错 MISRA只接受有原型的函数,即使是静态函数。这允许程序员将其函数放置在文件中的任何位置,而不考虑调用顺序。没有原型,主函数必须是文件中最新的函数,而多函数递归是不可能的,因为一个函数只能调用上面声明的函数C 我是否可以选择禁用这两个MISRA规则:每个函数一条语句和强制函数原型?,c,misra,C,Misra,我们公司现在是ISO-13485(医疗器械),希望使用MISRAC2012。我阅读了该标准,但如果我认为它可以提高稳定性和可读性,我无法确定是否允许禁用某些规则 两个例子: MISRA只允许每个函数有一个返回语句。这通常会导致嵌套的条件结构看起来像圣诞树。我真的不认为这个规则增加了安全性,因为它使代码可读性降低,更容易出错 MISRA只接受有原型的函数,即使是静态函数。这允许程序员将其函数放置在文件中的任何位置,而不考虑调用顺序。没有原型,主函数必须是文件中最新的函数,而多函数递归是不可能的,因
如果我想禁用这两个规则,我可以这样做吗?有顾客会因此责备我吗 您可以遵循偏差流程,该流程的一部分是由合格的技术人员审查偏差。偏差可以涵盖个别不合规情况,也可以是项目范围内的偏差 那么,您将如何证明您所要求的项目范围内的偏差 我最多只能说,每一项违反行为都应该得到审查。在某些情况下,您的推理,例如,深嵌套可能无法读取/无法维护,必须通过一个问题来权衡,为什么它们一开始就那么深?换句话说,可能函数做得太多,需要分解成更小的模块。
我假设您使用的是一个静态分析工具,它足够聪明,能够提供一种方法,一旦偏差得到批准,就不会继续报告违规行为。MISRA-C:2012有三个类别,所有指令和规则都在这三个类别下排序:
- 强制性的。你必须遵守这些规定,不允许有任何偏差
- 必需的。您必须遵守这些规则,但如果您提出正式的规则偏差,您可以违反这些规则。你需要一个很好的理由
- 咨询。建议遵循这些原则,但您可以在不提出正式偏差的情况下打破这些原则(尽管提出偏差是推荐的做法)
至于每个函数的一个返回语句,我认为是a(我想我是唯一一个真正费心研究需求来自何处的人)。你应该对这条规则提出永久性的背离,因为这是胡说八道。就我个人而言,我将该要求重新表述为“函数不应该有多个返回语句,除非多个返回语句导致更可读的代码”。这涵盖了该规则的真正意图,即避免意大利面编程
MISRA只接受有原型的函数,即使是静态函数。这允许程序员将其函数放置在文件中的任何位置,而不考虑调用顺序。没有原型,主函数必须是文件中最新的函数,而多函数递归是不可能的,因为一个函数只能调用上面声明的函数 我不相信这有任何意义,好像你在试图解决一个根本不存在的问题。根据MISRA的要求,您应该通过1)实际知道自己在做什么和2)使用静态分析工具来避免意外递归 如果希望调用堆栈为func1()->func2()->func3(),并阻止func2()或func3()调用func1(),最好通过正确的程序设计来解决。赋予函数直观的名称并使用常识将使您走得更远 如果这还不够,那么您可以将翻译单元一分为二,并为内部创建一个单独的h/c文件对。如果您有很长的源文件,其中包含很多函数,以至于程序员无法跟踪它们,那么您描述的风险主要是一个问题。这也很好地表明文件(和/或函数)应该分成几个部分 至于这个MISRA规则背后的理由,这是一个非常合理的理由,即阻止旧的C90垃圾“发明”调用约定(隐式int返回类型、构造参数等),仅仅因为编译器找不到函数原型。您绝对不应该偏离这条规则。规则15.5(函数末尾应该有一个单点退出)是一条建议规则。因此,如果您的内部流程如此记录,您可以不遵守此规则 规则8.2(函数应为原型形式)是一个必需的规则,因为(IMHO)是合理的,因为它确保您明确定义函数返回类型以及所有参数的数量和类型,从而避免