首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文字为零,而不是米斯拉的空指针常量警告。

文字为零,而不是米斯拉的空指针常量警告。
EN

Stack Overflow用户
提问于 2013-03-05 15:41:04
回答 3查看 2.6K关注 0票数 4

我的职能是:

代码语言:javascript
复制
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++规则4-10-2 (必需):文字0 (0)不能用作空指针常量.

现在,如果numShots是一个“真正的”指针,我可以将0改为NULL。但是numShots是参考的,我应该像对待int一样对待它。

米斯拉想要什么?为什么?

EN

回答 3

Stack Overflow用户

发布于 2013-03-05 15:50:56

因为nums是一个unsigned int,所以您需要与0U进行比较,其中附加的'U‘表示文字是无符号的int,而不是无符号的int。

这总是困住我的团队。我们不明白为什么零必须标记为无符号。

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

票数 4
EN

Stack Overflow用户

发布于 2013-03-06 14:23:32

让我首先说,我没有米斯拉-C++的经验,但有很多米斯拉-C。

MISRA对类型安全也有一些关注,这也适用于MISRA++。其中一个担忧是,不应出现隐性类型晋升。这是一个有效的关注,隐性类型的推广是很难理解和导致错误。令人惊讶的是,大多数C和C++程序员甚至不知道隐式促销是如何工作的。为了对程序员进行这方面的教育并防止这些bug的发生,有许多关于隐式类型转换/升级的MISRA规则。

  • 其中一个规则强制所有整数文本的'u‘后缀。该规则的基本原理是澄清接近最大值int值的大文本是无符号的,例如,文本0x80000000的类型对读取器来说并不明显。(我个人认为这一规则是多余的,有些误导,因为其他规则已经涵盖了所有隐含的转换危险。)
  • 还有另一条规则,即指针对空的检查应该是显式的。不允许您编写if(ptr),您应该编写if(ptr!=NULL)。理由是可读性和类型安全。
  • 显然有这样一条规则,指针不应该与零文字进行比较。我不明白这背后的原因,据说他们担心你把指针和普通的整数变量混为一谈。显然,他们已经决定偏离比亚恩·斯特鲁斯特鲁普()的雄心,在C++中消除空指针的神秘感。根据Stroustrup,NULL和0在C++中总是等价的(尽管C++11将有一个nullptr关键字来一劳永逸地解决这个混乱)。

上面提到的任何规则都与您的示例中的代码无关!您将引用与零文字进行比较,这是非常安全的。一名米斯拉检查员可能会抱怨没有“u”后缀,但你的检查人员没有。

我的结论是:

  • 您的MISRA++检查程序是错误的,并且会产生错误。
  • 特定的MISRA++规则对文字为零似乎没有任何意义。您应该针对此规则在MISRA实现中提出一个偏差,并完全忽略该规则,直到有人能够提供它的基本原理为止。
票数 3
EN

Stack Overflow用户

发布于 2014-04-14 07:52:32

我可能错了,我没有真正熟悉编程,而且答案可能有点晚了,但我认为您的MISRA-C检查器认为“他在将类型为”引用“的变量与一个文字常量进行比较,所以他必须检查空引用”,尽管它对引用并不真正有效,但是您可以尝试将函数props.numOfS()的返回值赋给一个新变量,然后在另一行中对numS引用的变量执行赋值,同时对新变量进行比较。

代码语言:javascript
复制
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) {
        ..
   }
}

在那之后检查它是否在抱怨。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15227956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档