通过 dlsym() 获得空指针,目标是调用该指针引用的函数。与 C 风格的强制转换不同,尝试使用 static_cast 或 reinterpret_cast 进行强制转换已失败。
在 C 98/03 中不允许将 void 指针直接转换为函数指针。然而,C 0x 提供了条件支持,允许实现来决定行为。
未定义的行为方法:
虽然标准未定义,但以下代码可能适用大多数平台:
void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast(reinterpret_cast(gptr));
或者:
fptr my_ptr = 0;
reinterpret_cast(my_ptr) = gptr;
复杂但可移植的方法:
此方法利用了函数指针的地址是对象指针的事实:
// Get address as object pointer
void (**object_ptr)() = &my_ptr;
// Convert to void** (also an object pointer)
void **ppv = reinterpret_cast(object_ptr);
// Store address from 'gptr' in memory cell pointed to by 'ppv'
*ppv = gptr;
此方法在标准中仍未定义,但在大多数实现上应该运行得相当好。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3