【发布时间】:2010-10-04 12:09:41
【问题描述】:
我有一些 Visual C++ 代码接收指向缓冲区的指针,该缓冲区包含需要由我的代码处理的数据以及该缓冲区的长度。由于我无法控制的错误,有时此指针未初始化或不适合读取的代码进入我的代码(即当我尝试访问缓冲区中的数据时它会导致崩溃。)
所以,我需要在使用它之前验证这个指针。我不想使用 IsBadReadPtr 或 IsBadWritePtr,因为每个人都同意它们是错误的。 (谷歌他们的例子。)它们也不是线程安全的——在这种情况下这可能不是问题,尽管线程安全的解决方案会很好。
我在网上看到了通过使用 VirtualQuery 或仅在异常处理程序中执行 memcpy 来完成此任务的建议。但是,需要执行此检查的代码是时间敏感的,因此我需要最有效的检查,而且也是 100% 有效的。任何想法将不胜感激。
要明确一点:我知道最好的做法是只读取错误的指针,让它导致异常,然后将其追溯到源头并修复实际问题。但是,在这种情况下,错误指针来自我无法控制的 Microsoft 代码,因此我必须对其进行验证。
还要注意,我不在乎指向的数据是否有效。我的代码正在寻找特定的数据模式,如果没有找到它们将忽略这些数据。我只是想防止在对这些数据运行 memcpy 时发生崩溃,并且在尝试 memcpy 时处理异常将需要更改遗留代码中的十几个位置(但如果我有类似 IsBadReadPtr 的调用我只会必须在一处更改代码)。
【问题讨论】:
-
你能发布一个调用栈(一直到 main 或 WinMain)吗?
-
我在我的回答中添加了一段:如果您之前接触过所有堆栈页面,也许您可以安全地使用 IsBadReadPtr。
-
我不知道您使用 VirtualQuery 的示例代码有什么问题。一个普遍的问题是,即使 VirtualQuery 说内存很好,另一个线程可能会在您测试它之后但在您尝试读取它之前释放内存:因此,考虑到多线程,提前测试它不是 ...
-
,,, 在异常处理程序中保护您的读取尝试的替代品。
标签: c++ windows visual-c++ memory