首先让我说我没有 MISRA-C++ 的经验,但是有很多 MISRA-C。
MISRA-C 对适用于 MISRA-C++ 的类型安全有一些担忧。一个这样的担忧是不应该发生隐式类型提升。这是一个有效的问题,隐式类型提升很难理解并导致错误。令人惊讶的是,大多数 C 和 C++ 程序员甚至不知道隐式类型提升是如何工作的。为了让程序员了解这一点并防止此类错误,有许多关于隐式类型转换/提升的 MISRA 规则。
一条这样的规则对所有整数文字强制使用 'u' 后缀。该规则背后的基本原理是澄清接近最大 int 值的大型文字是无符号的,例如文字的类型对0x80000000
读者来说并不明显。(我个人认为该规则是多余的并且有些误导,因为所有隐式转换危险都已被其他规则涵盖。)
还有另一条规则指出针对 NULL 的指针检查应该是明确的。你不能写if(ptr)
,你应该写if(ptr!=NULL)
。基本原理是可读性和类型安全。
显然有这条规则不应该将指针与零文字进行比较。我不明白这背后的基本原理,据说他们害怕你把指针和普通的整数变量混在一起。他们显然已经决定偏离 Bjarne Stroustrup 的雄心壮志,即在 C++ 中揭开空指针的神秘面纱。根据 Stroustrup 的说法,NULL 和 0 在 C++ 中总是等价的(尽管 C++11 将有一个 nullptr 关键字一劳永逸地解决这个问题)。
上述规则都与您示例中的代码无关!您正在将引用与零文字进行比较,这是非常安全的。MISRA 检查器可能会抱怨缺少“u”后缀,但您的检查器没有。
我的结论是:
- 您的 MISRA-C++ 检查器有故障并给出不正确的错误。
- 针对文字零的特定 MISRA-C++ 规则似乎没有任何意义。您应该在 MISRA 实施中提出与此规则的偏差并完全忽略该规则,直到有人可以提供理由。