MISRA C规则15.5由于多次使用具有返回的定义而在函数中多次退出

时间:2018-01-02 08:29:04

标签: c misra

我试图从我的代码中删除违反规则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本身。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

关于在函数中使用多个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} );
}