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

避免转换函数指针

12.15 ID_functionPointerCast
目录 › next › previous

函数指针和不兼容的类型转换会导致标准未定义的行为。

示例:

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