我遇到了以下奇怪的代码块.想象你有以下typedef:
typedef int (*MyFunctionPointer)(int param_1,int param_2);
然后,在函数中,我们尝试以下列方式从DLL运行函数:
LPCWSTR DllFileName; //Path to the dll stored here LPCSTR _FunctionName; // (mangled) name of the function I want to test MyFunctionPointer functionPointer; HINSTANCE hInstLibrary = LoadLibrary( DllFileName ); FARPROC functionAddress = GetProcAddress( hInstLibrary,_FunctionName ); functionPointer = (MyFunctionPointer) functionAddress; //The values are arbitrary int a = 5; int b = 10; int result = 0; result = functionPointer( a,b ); //Possible error?
问题是,没有任何方法可以知道我们使用LoadLibrary获取的地址的功能是否有两个整数参数.dll名称由用户在运行时提供,然后列出导出函数的名称和用户选择要测试的那个(再次,在运行时:S:S).
那么,通过在最后一行执行函数调用,我们不是打开可能的堆栈损坏的大门吗?我知道这会编译,但是在我们将错误的参数传递给我们指向的函数的情况下会发生什么样的运行时错误?
解决方法
如果预期和使用的参数数量或类型以及调用约定不同,我可以想到三个错误:
>如果调用约定不同,将读取错误的参数值
>如果函数实际上需要的参数多于给定的参数,则随机值将用作参数(我会让你想象一下如果涉及指针的后果)
>在任何情况下,返回地址都是完全垃圾,因此一旦函数返回,将会运行随机数据和随机数据.
用两个词来说:未定义的行为
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。