指针与整数不应相互转换
12.7 ID_ptrIntCast
指针与整数相互转换容易造成地址不完整、寻址错误、降低可移植性等多种问题。
指针与整数的转换由实现定义,整数的符号和取值范围可能与指针有冲突,错误的值转为指针也会导致标准未定义的行为。在某些平台上指针与 size_t 可以安全转换,但不具备可移植性,审计工具不妨通过配置决定是否放过这种转换。C 标准规定指针可以转为 intptr_t 或 uintptr_t,但也声明了这些类型不是编译器必须实现的类型。
示例:
void foo(int* p) {
vector<int> v;
v.emplace_back((int)p); // Non-compliant
....
}
例中将指针转为 int 是不符合要求的,指针的值可能会超过 int 的范围。
配置
allowPointerToSizeType: 是否放过指针与 size_t 的转换
相关
依据
ISO/IEC 9899:1999 6.3.2.3(5)-implementation
ISO/IEC 9899:1999 7.18.1.4(1)
ISO/IEC 9899:2011 6.3.2.3(5)-implementation
ISO/IEC 9899:2011 7.20.1.4(1)
ISO/IEC 14882:2003 5.2.10(4 5)-implementation
ISO/IEC 14882:2011 3.7.4.3(1)
ISO/IEC 14882:2011 5.2.10(4 5)-implementation
参考
MISRA C 2004 11.3
MISRA C 2012 11.4
MISRA C++ 2008 5-2-9
SEI CERT INT36-C