4

我有这个功能:

void InitS(unsigned int &numS){
   // this function returns a container for unsigned int
   // but it has a cast for int
   numS = props.numOfS();
   if (numS > 0) {
        ..
   }
}

它编译但给了我这个 MISRA 警告:

MISRA-C++ 规则 4-10-2(必需):文字零 (0) 不得用作空指针常量。

现在,如果numShots是一个“真正的”指针,我本可以更改0NULL. 但是numShots是参考,我应该把它当作一个int.

MISRA 想要什么,为什么?

4

3 回答 3

4

由于numsunsigned int,您需要比较0U,其中附加的“U”表示文字是无符号整数,而没有符号整数。

这一直困扰着我的团队。我们不明白为什么需要将零标记为无符号。

此外,您不处理指针。函数签名 ,unsigned int&表示变量将通过引用而不是指针传递。您将修改原始对象,而不是副本。

于 2013-03-05T15:50:56.747 回答
3

首先让我说我没有 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 实施中提出与此规则的偏差并完全忽略该规则,直到有人可以提供理由。
于 2013-03-06T14:23:32.493 回答
0

我可能是错的,我在编程方面不是很老练,可能答案有点晚了,但我认为您的 MISRA-C 检查器正在考虑“他正在将“引用”类型的变量与文字常量进行比较,所以他必须检查 NULL 引用”,即使它对引用并不真正有效,但您可以尝试将函数 props.numOfS() 的返回值分配给新变量,然后对 numS 引用的变量进行分配对新变量进行比较时的另一行。

IE

void InitS(unsigned int &numS){
   unsigned int foo;
   foo = props.numOfS(); //this function returns a container for unsigned int but it has a cast for int
   numS = foo;
   if (foo > 0) {
        ..
   }
}

之后检查它是否在抱怨。

于 2014-04-14T07:52:32.253 回答