未指向同一数组或同一对象的指针不可比较大小
14.7 ID_illPtrComparison
不在同一数组或同一对象中的地址之间没有前后关系,比较这种地址的大小往往意味着逻辑错误,也会导致标准未定义或未声明的行为。
对于 C++ 语言,即使在同一对象中:
- 静态成员之间
- 静态成员与非静态成员之间
- 由 access-specifier 分隔的成员之间
也不应比较地址的大小。
示例:
bool b;
int i, j;
b = &j > &i; // Non-compliant, undefined in C, unspecified in C++
struct A {
int i, j;
} a;
b = &a.j > &a.i; // Compliant, ‘b’ is true
class B {
static int i;
int j;
public: // access-specifier
int k;
int foo() {
return &i < &j // Non-compliant, unspecified
|| &j < &k; // Non-compliant, unspecified
}
};
另外,指针与空指针之间也不应比较大小:
int* p = &foo;
bool b = p < NULL; // Non-compliant
指针与空指针比较大小是一种常见笔误,对此本规则特化为 ID_oddPtrZeroComparison。
相关
依据
ISO/IEC 9899:1999 6.5.8(5)-undefined
ISO/IEC 9899:2011 6.5.8(5)-undefined
ISO/IEC 14882:2003 5.9(2)-unspecified
ISO/IEC 14882:2011 5.9(2)-unspecified
参考
C++ Core Guidelines ES.62
MISRA C 2004 17.3
MISRA C 2012 18.3
MISRA C++ 2008 5-0-18
SEI CERT ARR36-C