我有一些Visual C++代码,该代码接收一个指向缓冲区的指针,该缓冲区包含需要由我的代码处理的数据以及该缓冲区的长度。由于无法控制的错误,有时此指针未初始化或不适合读取时会进入我的代码中(即,当我尝试访问缓冲区中的数据时,它会导致崩溃。)

因此,在使用它之前,我需要验证该指针。我不想使用IsBadReadPtr或IsBadWritePtr,因为每个人都同意他们是 buggy 。 (例如,以Google为例。)它们也不是线程安全的-在这种情况下,尽管线程安全的解决方案会不错,但这可能不是问题。

我已经在网上看到了通过使用VirtualQuery或仅在异常处理程序中执行memcpy来完成此操作的建议。但是,需要执行此检查的代码是时间敏感的,因此我需要可能也是100%有效的最有效的检查。任何想法,将不胜感激。

明确一点:我知道最佳实践是只读取错误的指针,让它引起异常,然后将其追溯到源并修复实际问题。但是,在这种情况下,错误的指针来自我无法控制的Microsoft代码,因此我必须对其进行验证。

另请注意,我不在乎所指向的数据是否有效。我的代码正在寻找特定的数据模式,如果找不到它们,将忽略该数据。我只是想防止在对这些数据运行memcpy时发生崩溃,并且在尝试memcpy时处理异常将需要更改旧代码中的十几个位置(但是如果要调用IsBadReadPtr之类的东西,我只会必须在一个地方更改代码)。

最佳答案



我猜这只是不是线程安全的IsBadWritePtr。



这实际上就是IsBadReadPtr所做的事情……如果您在代码中这样做,则您的代码将具有与IsBadReadPtr实现相同的错误:http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx

-编辑:-

我已经读过的IsBadReadPtr的唯一问题是,错误的指针可能指向(因此您可能不小心触及了)堆栈的保护页。也许可以通过以下方法避免此问题(并因此安全使用IsBadReadPtr):

  • 知道进程中正在运行哪些线程
  • 知道线程的堆栈在哪里,以及它们的大小
  • 在开始调用isBadReadPtr
  • 之前,向下走每个堆栈,至少有一次触摸堆栈的每一页

    另外,与上面的URL相关的一些注释也建议使用VirtualQuery。

    关于c++ - 最有效的替代IsBadReadPtr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/496034/

    10-13 01:50