这是C4055警告信息。
'转换':从数据指针'type1'到函数指针'type2'
数据指针(可能不正确)转换为函数指针 这是/ Za下的1级警告和/ Ze下的4级警告。
我们如何解决此警告?(以正确的方式,而不是技巧)
修改
这是一段代码摘要警告。
typedef NTSTATUS (*t_ObRegisterCallbacks)
(
IN POB_CALLBACK_REGISTRATION CallBackRegistration,
OUT PVOID *RegistrationHandle
);
t_ObRegisterCallbacks g_ObRegisterCallbacks = NULL;
void foo()
{
g_ObRegisterCallbacks = (t_ObRegisterCallbacks)MmGetSystemRoutineAddress(®Name); //C4055
}
//warning C4055: 'type cast' : from data pointer 'PVOID' to function pointer 't_ObRegisterCallbacks'
答案 0 :(得分:10)
WDK头文件不是那么干净。 MmGetSystemRoutineAddress()的返回类型应该是声明FARPROC而不是PVOID。尽管如此,在使用WDK编写设备驱动程序的任何机器上都无关紧要,void *可以无问题地转换为函数地址,数据和代码指针在32位和64位平台上具有相同的大小。当我们得到分段记忆模型的痛苦时,这将是一个寒冷的日子。
我建议您只需使用#pragma warning(禁用:4055)
关闭警告答案 1 :(得分:7)
不允许在数据和函数指针之间进行转换。您可以使用union hack进行类型转换:包含两个指针的union类型,然后写入一个类型并作为另一个类型读取。毋庸置疑,就标准而言,这是不可移植的,但它使编译器感到高兴并且经常在实践中起作用。
将函数指针作为数据指针返回的函数(dlsym是这种类型的一个流行函数)被设计破坏了,你只能通过诸如union hack之类的技巧来解决这个问题。