代码之家  ›  专栏  ›  技术社区  ›  nowox

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

  •  4
  • nowox  · 技术社区  · 7 年前

    两个例子:

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   Lundin    7 年前

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

    • 强制性的你 遵循这些,你不允许做出偏差。
    • 必修的。你必须遵循这些规则,但如果你提出正式的偏离规则,你可以违反这些规则。你需要一个很好的理由。
    • 顾问的建议遵循这些原则,但您可以在不提出正式偏差的情况下打破这些原则(尽管提出偏差是推荐做法)。

    MISRA Compliance:2016

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


    known defect in MISRA-C inherited from IEC 61508 (我想我是唯一一个真正费心研究需求来源的人)。你应该对这条规则提出永久性的偏离,因为这是胡说八道。就我个人而言,我将该要求重新表述为“函数不应该有多个返回语句,除非多个返回语句导致更可读的代码”。这涵盖了该规则的真正意图,即避免意大利面编程。


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

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

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

        2
  •  2
  •   Andrew    7 年前

    规则15.5( 函数的末尾应有一个退出点 令人失望 这条规则。

    规则8.2( )是一个 要求的

    如果你愿意,你可以偏离指导原则,但这需要你证明这个决定是正确的!

        3
  •  1
  •   Veriloud    7 年前

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

    我认为,充其量也应该对每一项违规行为进行审查。在某些情况下,您的推理,例如,深度嵌套可能无法读取/无法维护,必须通过一个问题来权衡:为什么它们一开始就那么深?换句话说,可能函数做得太多了,需要分解成更小的模块。
    我假设您使用的是一个静态分析工具,它足够智能,可以提供一种方法,在偏差得到批准后不再继续报告违规行为。