是否可以检查内存地址是否有效?

Ric*_*ick 1 c++ assembly

一位客户带着一个应用程序来找我,但他们丢失了该应用程序的源代码。加载某些文件时,该应用程序似乎随机崩溃。我怀疑该问题是由于竞争条件造成的,其中删除了指针,然后未将其设置为 NULL 或未检查有效性。

当使用 OllyDBG 逐步执行程序集时,我发现崩溃总是发生在同一位置,因此这在某种程度上重新强化了我的理论。这是有时会崩溃的装配线,有时是关键字。

MOV EDI,DWORD PTR DS:[EAX]

是否可以通过本机汇编或通过内联汇编调用(或类似的方式)提取地址的 C++ 来验证内存地址是否有效且存在?

eer*_*ika 7

C++ 中没有通用的标准方法来验证内存地址。据我所知,也没有这样的汇编指令。

在内存映射系统(例如任何现代操作系统)上,您可以使用系统特定的 API 检查是否已为进程映射地址。从 C++ 的角度来看,映射到进程的地址并不保证该地址有效,但未映射的地址肯定是无效的。

此外,即使可以发现地址有效,也无法告诉您所需的对象是否在该地址中或其他地址中。


有一些工具可以在 C++ 语言1之外验证内存访问。例如,Valgrind 还可以编译提供地址清理程序和内存清理程序。大多数情况下,这些有助于检测无效访问,否则不会导致程序崩溃。但他们通常也可以提供有关该记忆的附加信息。

1如果您有权访问源代码。

我怀疑这个问题是由于竞争条件造成的

能够验证内存地址并不能解决这个问题。你应该做的1,是使用调试器找出正在访问的对象,找到访问该对象的所有位置。如果这些地方中的任何一个没有持有所有其他可能同时访问该对象的地方所共有的互斥锁,那么就会出现错误。

1如果您有权访问源代码。

丢失了源代码

如果您有大量预算,那么您可以尝试对其进行逆向工程并尝试找出它的用途。我不会屏住呼吸;最好宣布这是失败的原因。