避免与 void* 相互转换
12.5 ID_voidCast
与 void* 相互转换会打破类型限制,是不安全的类型转换。
C 语言的某些标准接口会使用 void*,可不受本规则限制,但在 C++ 代码中应避与 void* 相互转换。
示例:
struct A { .... };
void foo(void* v) {
A* a = (A*)v; // Non-compliant
....
}
例中参数 v 可以随意接受非 A 对象的指针,进而导致标准未定义的行为,代码的正确性单方面依赖开发者是不可靠的。
相关
依据
ISO/IEC 14882:2003 5.2.10(7)-unspecified
ISO/IEC 14882:2011 5.2.10(7)-unspecified
参考
MISRA C 2012 11.5
MISRA C 2012 11.6
MISRA C++ 2008 5-2-8