在编译器升级之后,我遇到了一条新的警告消息。
警告:指针与整数零-Wextra的有序比较 如果(inx > 0)
原来inx是一个指针。通常,我希望看到这段旧代码与0或NULL相比较。这让我想到了有符号值和无符号值,以及可能的风险。
一项研究表明:
这些似乎表明,一个地址(由malloc返回)永远不可能为零。
这让我想起了我以前的标准。
4.10指针转换 1空指针常量是整数类型的整数形式的整数值(5.19),等于零或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与指向对象的指针的所有其他值或指向函数类型的指针的其他值相区别。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。将空指针常量转换为指针到cv-qualified类型的转换是单个转换,而不是指针转换的顺序,然后是qualifi阳离子转换(4.4)。整数类型的空指针常量可以转换为std::nullptr_t类型的prvalue。
它特别指出,两个空指针比较相等。
考虑到了这一点,这是一小块未定义的代码吗?或者还有另一块我错过的拼图?
发布于 2014-04-21 16:00:24
它不是未定义的行为,但如果inx不是null,则结果不指定。
C++11 5.9/2:如果相同类型的两个指针p和q指向不同对象,这些对象不是同一个数组的一个或多个元素的成员,或者指向不同的函数,或者(如果其中一个为空),则
p<q、p>q、p<=q和p>=q的结果是未指定的。
因此,如果inx为null,则可以确保条件代码不会执行,但如果它不是null,则不会执行条件代码。比较应该是inx != 0,它被很好地定义为真当且仅当inx是非空的。
发布于 2014-04-21 16:00:39
您正在查看指针转换,但您应该查看指针比较。
具体而言,比较不引用同一个数组或对象(子对象)的指针。
第5.9节第3和第4款,这一措词载于C++14草案。
将指针与对象进行比较是defined,如下所示:
如果两个操作数p和q比较相等(5.10),则p<=q和p>=q都会产生true和p<q,p>q都会产生false。否则,如果指针p大于指针q,则p>=q、p>q、q<=p和q<p都会产生true和p<=q、p<q、q>=p和q>p都会产生false。否则,每个操作符的结果都不指定.。。
在您的情况下,没有“指针比较大于”关系是定义的,因此运算符根据他们的“否则”行为,提供未指定的结果。这种比较不会直接使程序崩溃,但如果假设if是非空的,则可以通过inx进行任何一个分支。
https://stackoverflow.com/questions/23200872
复制相似问题