避免转换函数指针
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