我有一些Visual C++代码接收指向缓冲区的指针,需要由我的代码和该缓冲区的长度来处理数据。由于我的控制之外的错误,有时这个指针进入我的代码未初始化或不适合读取(即当我尝试访问缓冲区中的数据时,它会导致崩溃)。IsBadReadPtr最有效的替代品?
所以,我需要验证这一点指针在我使用它之前。我不想使用IsBadReadPtr或IsBadWritePtr,因为每个人都同意他们是越野车。 (谷歌他们的例子。)他们也不是线程安全的 - 这可能不是一个担心在这种情况下,虽然线程安全的解决方案会很好。
我已经看到了通过使用VirtualQuery完成此操作的网络建议,或者只是在异常处理程序中执行memcpy。但是,需要完成此项检查的代码是时间敏感的,因此我需要进行最有效的检查,这也是100%有效的。任何想法,将不胜感激。
只是要清楚:我知道最好的做法是只读错误的指针,让它引发异常,然后追溯到源代码并修复实际问题。但是,在这种情况下,坏指针来自我无法控制的Microsoft代码,所以我必须验证它们。
请注意,我不关心指出的数据是否有效。我的代码正在寻找特定的数据模式,如果没有找到它们,它们会忽略数据。我只是试图防止在这个数据上运行memcpy时发生的崩溃,并且在memcpy点试图处理异常将需要更改我的代码中的十几个地方(但是如果我有像IsBadReadPtr这样的东西来调用,我只会必须在一个地方更改代码)。
你可以发布一个调用堆栈(一直到main或WinMain)吗? – MSN 2009-01-30 16:25:56
我在回答中添加了一段:如果您之前触摸了所有堆栈页面,也许您可以安全地使用IsBadReadPtr。 – ChrisW 2009-01-30 17:41:08
我不知道,使用VirtualQuery的示例代码有什么问题。一个普遍的问题是,即使VirtualQuery认为内存是好的,另一个线程可能在测试之后但在尝试读取之前释放内存:因此,在给定多线程的情况下,事先对其进行测试并不是... – ChrisW 2009-01-30 20:40:48