我的职能是:
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一样对待它。
米斯拉想要什么?为什么?
发布于 2013-03-05 15:50:56
因为nums是一个unsigned int,所以您需要与0U进行比较,其中附加的'U‘表示文字是无符号的int,而不是无符号的int。
这总是困住我的团队。我们不明白为什么零必须标记为无符号。
而且,您并不是在处理指针。函数签名unsigned int&表示变量将通过引用而不是指针传递。您将修改原始对象,而不是副本。
发布于 2013-03-06 14:23:32
让我首先说,我没有米斯拉-C++的经验,但有很多米斯拉-C。
MISRA对类型安全也有一些关注,这也适用于MISRA++。其中一个担忧是,不应出现隐性类型晋升。这是一个有效的关注,隐性类型的推广是很难理解和导致错误。令人惊讶的是,大多数C和C++程序员甚至不知道隐式促销是如何工作的。为了对程序员进行这方面的教育并防止这些bug的发生,有许多关于隐式类型转换/升级的MISRA规则。
0x80000000的类型对读取器来说并不明显。(我个人认为这一规则是多余的,有些误导,因为其他规则已经涵盖了所有隐含的转换危险。)if(ptr),您应该编写if(ptr!=NULL)。理由是可读性和类型安全。上面提到的任何规则都与您的示例中的代码无关!您将引用与零文字进行比较,这是非常安全的。一名米斯拉检查员可能会抱怨没有“u”后缀,但你的检查人员没有。
我的结论是:
发布于 2014-04-14 07:52:32
我可能错了,我没有真正熟悉编程,而且答案可能有点晚了,但我认为您的MISRA-C检查器认为“他在将类型为”引用“的变量与一个文字常量进行比较,所以他必须检查空引用”,尽管它对引用并不真正有效,但是您可以尝试将函数props.numOfS()的返回值赋给一个新变量,然后在另一行中对numS引用的变量执行赋值,同时对新变量进行比较。
即
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) {
..
}
}在那之后检查它是否在抱怨。
https://stackoverflow.com/questions/15227956
复制相似问题