【问题标题】:MISRA C Rule 15.5 Multiple exit in a function due to multiple usage of a define which is having returnMISRA C 规则 15.5 由于多次使用具有返回的定义而导致函数中的多次退出
【发布时间】:2018-01-02 08:29:03
【问题描述】:

我正在尝试从我的代码中消除违反规则 15.5 的行为。

示例代码:

#define RETURN_VAL(num) {return (2 * num);} 

static int32_t
func(int32_t n1, int32_t n2, int32_t n3)
{  
    if (n1 == 1) {                
        RETURN_VAL(1);
    }
    if (n2 == 2) {
        RETURN_VAL(2);                  
    }
    if (n3 == 3) {
        RETURN_VAL(3);             
    }

    return 0;
}

由于MACRO(有返回值)在多个地方使用,导致违反规则15.5。

有没有办法将这种保留作为 MACRO 本身来解决。

【问题讨论】:

  • 相应地更改它,使其变为return MACRO(num); 没有办法让你的蛋糕也吃掉。保留宏本身也是不明智的。但这是另一回事。
  • 请注意,使用隐藏控制流的宏被认为是一种不好的做法。你真的应该重写代码来删除它。
  • 原始宏的意义何在?除了让代码的读者感到困惑之外?
  • 如果您正在开发需要 MISRA 的代码,那么 sn-p 无论如何都不应该通过审查(至少我不会让它通过)。您正在隐藏代码流。您的宏没有声明它将修改返回值。您有多个返回(即使删除宏并将它们放在代码中仍然违反 MISRA)。

标签: c misra


【解决方案1】:

您可以修改上面的代码以删除使用整数retval的多个返回

如果您在返回之前绝对必须使用宏,请使用如下所示的宏。不要用宏隐藏 return 语句。它不会影响任何 MISRA 分析。

#define  RET(num) (2 * num)

static int32_t
func(int32_t n1, int32_t n2, int32_t n3)
{  
    int32_t retval = 0;
    if (n1 == 1) {                
        retval = RET(1);
    }
    else if (n2 == 2) {
        retval = RET(2);
    }
    else if (n3 == 3) {
        retval = RET(3);             
    }

    return retval;
}

【讨论】:

    【解决方案2】:

    关于在一个函数中使用多个return语句,如果它导致更可读的代码是完全可以的。规则 15.5 有问题,理由有问题,see this

    话虽如此,这里的主要问题是使用无意义的类似函数的宏,这违反了 MISRA-C 指令 4.9。总体来说,函数接口比较奇怪,真的需要用3个命名参数吗?更好的选择:

    static int32_t func(int32_t n[N])
    {  
        for(int32_t i=0; i<N; i++)
        {
          if(n[i] == i+1)
          {
            return 2 * (i+1);
          }
        }
        return 0;
    }
    

    如果您出于某种原因必须保留 icky API,请使用包装器:

    inline static int32_t func_wrapper (int32_t n1, int32_t n2, int32_t n3)
    {
      return func( (int32_t[3]){n1, n2, n3} );
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 2018-05-06
      • 1970-01-01
      • 2010-12-09
      • 2013-05-05
      • 2014-06-16
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      相关资源
      最近更新 更多