☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

未指向同一数组或同一对象的指针不可比较大小

14.7 ID_illPtrComparison
目录 › next › previous

不在同一数组或同一对象中的地址之间没有前后关系,比较这种地址的大小往往意味着逻辑错误,也会导致标准未定义或未声明的行为。

对于 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。

相关

ID_illPtrDiff 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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.