ein*_*ude 5 c++ function-pointers
我有以下代码:
typedef void * (__stdcall * call_generic)(...);
typedef void * (__stdcall * call_push2)(unsigned long,unsigned long);
void * pfunc;
// assume pfunc is a valid pointer to external function
// this is a logically correct way of calling, however this includes:
// add esp, 8
// after the call, and that breaks my stack.
((call_generic)pfunc)(1,1);
// however, if i use this call:
((call_push2)pfunc)(1,1);
// this does not happen and code works properly.
Run Code Online (Sandbox Code Playgroud)
跟踪所有调用并手动计算args是很痛苦的(前面有很多这样的调用),我更喜欢宏或类似的东西,但有了这个bug,它是不可能的.
有解决方案吗?是否有另一种创建call_generic类型的方法来做这些事情?
我真的不明白为什么它会"清理"但是会严重破坏我的堆栈,从而导致先前定义的变量丢失.
((call_generic)pfunc)(1,1);如果 指向的函数pfunc实际上具有您转换为的签名,则只是逻辑上正确的调用方式void *(...)。您的代码告诉编译器进行可变参数调用,因此它会进行可变参数调用。对不是 varargs 函数的函数进行 varargs 调用不起作用(在这种情况下,对于谁必须清理堆栈存在分歧,并且完成了两次)。
没有办法免费做到这一点。在调用之前,您必须以某种方式将函数指针转换为正确的签名,否则调用代码不知道如何以被调用者代码可以使用的方式传递参数。
一种选择是确保所有pfunc可能指向的被调用函数具有相同的签名,然后转换为该类型。例如,您可以将它们设为所有可变参数函数,尽管我并不特别推荐它。做您不想做的事情会更加类型安全 - 确保此处可能出现的所有函数都采用两个unsigned long, 并转换为call_push2。