我经常用 C 语言构建函数来检查一些参数并返回错误代码。
当我发现错误时停止值检查的最佳方法是什么?
第一个例子:
ErrorCode_e myCheckFunction( some params )
{
ErrorCode_e error = CHECK_FAILED;
if( foo == bar )
{
if( foo_1 == bar_1 )
{
if( foo_2 == bar_2 )
{
error = CHECK_SUCCESS;
}
}
}
return error;
}
第二个例子:
ErrorCode_e myCheckFunction( some params )
{
if( foo != bar )
{
return CHECK_FAILED;
}
if( foo_1 != bar_1 )
{
return CHECK_FAILED;
}
if( foo_2 != bar_2 )
{
return CHECK_SUCCESS;
}
}
我更喜欢第一种方法,因为我读到 MISRA 规则避免使用多个 return 语句。
哪种方法是最好的?
第二种是最好的,因为它更容易阅读,随着复杂性的增加可以很好地扩展,并且在出现错误时立即停止执行该函数。当函数内部有大量错误处理时(例如,如果函数是解析器或协议解码器),这是编写此类函数的唯一明智的方法。
MISRA-C 不允许在函数中使用多个 return 语句,这是 MISRA-C 的缺陷。据说其目的是禁止从各处返回意大利面条代码,但教条地禁止多个 return 语句实际上会使代码的可读性大大降低,正如我们从您的示例中看到的那样。想象一下,如果您需要检查 10 个不同的错误。然后你就会有 10 个复合 if 语句,这将是一团难以阅读的混乱。
我已多次向 MISRA 委员会报告此缺陷,但他们没有听取。相反,MISRA-C 只是盲目引用 IEC 61508 作为规则的来源。反过来,它只列出了该规则的一个有问题的来源(IEC 61508:7 C.2.9),而且它是一本 1979 年的恐龙编程书。
这既不专业也不科学——MISRA-C 和 IEC 61508(以及 ISO 26262)都应该为(直接或间接)将 1979 年的主观废话列为其唯一来源和理由而感到羞耻。
只需使用第二种形式并针对此缺陷 MISRA 规则提出永久偏差。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)