我发布了一篇关于验证指针可访问性的question。结论是要么使用IsBadReadPtr检查指针,要么使用SEH捕获异常(最好两者都不使用,并调试应用程序,但这不是问题所在)。
IsBadReadPtr据说是坏的,因为除其他原因外,它会尝试读取指针,并捕获任何异常。它可能会catch a stack guard page exception,从而阻止它到达内存管理器,而内存管理器本应扩大堆栈。
如果我使用SEH并且只捕获异常访问冲突异常,这会产生相同的问题吗?
另一件事:使用SEH意味着什么?
This文章建议“编译器不能在SEH保护的代码中执行流分析”。如果我调用try块内的函数如何。编译器会不会根本不优化被调用的函数?
最佳答案
如果我使用SEH并且只捕获异常访问冲突异常,这会产生相同的问题吗?
我想会的。解决方法可能是在开始调用IsBadReadPtr之前,探测您所知道和关心的任何线程的堆栈(通过“探测堆栈”我的意思是故意触摸堆栈中的每个内存页,以确保每个页都是预先分配的)。
编译器会不会根本不优化被调用的函数?
如果函数不是内联的,我希望编译器应用通常的优化(函数的优化不会受函数调用位置的影响)。