c - SEH、访问冲突和堆栈保护页面

标签 c winapi seh

我发布了 question关于验证指针的可访问性。结论是要么使用 IsBadReadPtr 检查指针,要么使用 SEH 捕获异常(最好两者都不使用,并调试应用程序,但这不是这里的问题)。

IsBadReadPtr 被认为是错误的,因为除其他原因外,它会尝试读取指针,并会捕获任何异常。它可能 catch a stack guard page exception ,从而防止它到达内存管理器,内存管理器应该扩大堆栈。

如果我使用 SEH 并且只捕获 EXCEPTION_ACCESS_VIOLATION 异常,这会产生同样的问题吗?

另一件事:使用 SEH 的含义是什么? This文章建议“编译器无法在受 SEH 保护的代码中执行流分析”。如果我在 __try block 中调用一个函数怎么样?编译器会不会根本不优化被调用的函数?

最佳答案

If I use SEH and catch only EXCEPTION_ ACCESS_VIOLATION exceptions, would this create the same problem?

我觉得可以。解决方法可能是在开始调用 IsBadReadPtr 之前探测您知道和关心的任何线程的堆栈(通过“探测堆栈”我的意思是故意触摸堆栈中的每个内存页面,以确保每个页面是预先分配的)。

Would the compiler not optimize the called function at all?

如果函数未内联,我希望编译器应用通常的优化(函数的优化不会受到函数调用位置的影响)。

关于c - SEH、访问冲突和堆栈保护页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993551/

相关文章:

android - 如何从 .cpp 脚本启动 Android Activity ?

c - 两个不同显示器上的两个全屏窗口

c++ - 将字符串 IP 转换为 IPADDRESS 控制

c++ - 是否可以在 win32 应用程序中嵌入命令提示符?

c - 如何将 Win32 异常代码转换为字符串?

c++ - 关于 C++ 中的结构化异常 (SEH),我应该了解什么?

c - 对 main -collect2 : ld returned 1 exit status 的 undefined reference

c - 是否有一个标准的 C 函数来获取 Double 变量的绝对值

c - 这段代码的输出是什么以及如何输出?

windows - 关于汇编远程调用和天堂之门,触发异常的段调用是否会在抛出异常之前推送 cs 和 eip?