如何检查函数入口的形参,保证函数只有一条return语句?

How to check the formal parameters at the entry of a function and ensure that the function has only one return statement?

这只是为了满足所谓的 Misra C 2012 规范规则 15.5。我只需要在我的函数中做一个 return 语句,但我想做函数的参数检查。当参数检查失败时,可以直接结束。有了这个功能,就不用再执行下面的代码了。不符合规范的代码如下:

int32_t func(struct st *p, uint8_t num)
{
    if ((NULL == P) || (num > MAX_NUM)) {
        perror("print some error info");
        return -1;
    }

    // do something

    return 0;
}

如何改进?

您需要将 return 代码存储为单独的变量,并将 if 块后面的代码放入 else:

int32_t func(struct st *p, uint8_t num)
{
    int32_t rval;
    if ((NULL == P) || (num > MAX_NUM)) {
        perror("print some error info");
        rval = -1;
    } else {
        // do something
        rval = 0;
    }

    return rval;
}

通常在编写符合 MISRA-C 的代码时,您会以类似

的方式开始您的函数
int32_t result = OK; // whatever "OK" means in your context

然后,如果出现问题,您将其更改为错误代码,并在最后 return 更改。

值得注意的是,您的代码将受益于 enum 命名错误代码而不是幻数 0-1 等。当我们有一个 enum 错误代码类型时,我们可以使我们 API return 中的每个函数都具有相同的类型,然后记录每个函数可能的 return 值。非常人性化,让在调用应用程序中编写错误句柄变得更加愉快。

现在关于特定的 MISRA-C 规则,多年来我一直在给这个特定的规则一些非常尖刻的批评,。正确的是,如果您遵循他们给出的作为规则理由的来源链……因此,合理的解决方案可能只是在您的编码标准中创建一个与规则的永久偏差。正如对该 link 的评论所述,该规则已从 MISRA-C:2012 中的“必需”降级为“咨询”,因此您甚至不需要正式的偏差。

我个人遵循这条规则:

函数应该只有一个 return 语句 除非 多个 return 语句使代码更具可读性。

MISRA C 规则 15.5 是建议规则。

这意味着您不需要“正式”偏差来证明违规行为是合理的,尽管您仍应记录它。 “代码质量 - 可读性”的理由是适当的(参见 MISRA 合规性)

或者,您可以使用前向 GOTO,尽管这也违反了咨询规则。

所以我要说的是,虽然 MISRA 提出了一些建议,但如果您觉得需要违反其中一项规则,可以遵循适当的机制 - 您可以获得适当的批准,只要因为你完全清楚后果..

盲目遵守规则会导致代码质量低于受控违规!

[查看个人资料以了解从属关系]