避免转换函数指针
12.15 ID_functionPointerCast
函数指针和不兼容的类型转换会导致标准未定义的行为。
示例:
void foo();
typedef void (*fnp_t)(int);
void* p0 = (void*)&foo; // Non-compliant
fnp_t p1 = (fnp_t)&foo; // Non-compliant
p1(123); // Undefined behavior
例外:
fnp_t p = NULL; // Compliant
(void)p; // Let it go
p = (fnp_t)dlsym(h, "f"); // Let it go
对函数指针进行 void 转换,或 dlsym、GetProcAddress 等动态导入函数的系统接口可不受本规则约束。
依据
ISO/IEC 9899:1999 6.3.2.3(6 7 8)-undefined
ISO/IEC 9899:1999 6.5.2.2(9)-undefined
ISO/IEC 9899:2011 6.3.2.3(6 7 8)-undefined
ISO/IEC 9899:2011 6.5.2.2(9)-undefined
ISO/IEC 14882:2003 5.2.10(6)-undefined
ISO/IEC 14882:2011 5.2.10(6)-undefined
ISO/IEC 14882:2011 5.2.10(8)-implementation
参考
MISRA C 2004 11.1
MISRA C 2012 11.1
MISRA C++ 2008 5-2-6