SEH,访问冲突和堆栈保护页面

时间:2009-06-14 19:27:49

标签: c winapi seh

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

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

如果我使用SEH并仅捕获EXCEPTION_ ACCESS_VIOLATION异常,那会产生同样的问题吗?

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

1 个答案:

答案 0 :(得分:1)

  

如果我使用SEH并仅捕获EXCEPTION_ ACCESS_VIOLATION异常,那会产生同样的问题吗?

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

  

编译器根本不会优化被调用函数吗?

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