我正在使用C++ unmanaged,当我调用一个返回LPVOID的方法时,我遇到了这个问题.
LPVOID MyMethod(...);
问题是这个方法有时返回Bad Ptr,我想知道是否有一种方法可以检测到这个,如果返回的值是Bad Ptr.
我试过询问它是否为NULL而没有运气.
我知道如果结果是坏Ptr的唯一方法是在我调试时,我尝试了一些不同的方法,但仍然无法做到.
不,没有简单的方法来确定指针是否坏.
Windows确实有IsBadReadPtr,IsBadWritePtr.这些函数本质上存在缺陷 - 它们仅在调用时确定函数在地址空间中是否可读或可写.它们也可能是安全 问题的原因,永远不应该使用.
主要问题是没有办法区分仍然可以访问进程的"坏"指针和一个好的指针.
例如,
int g[5]; int somethingElse; void* GetPointer() { return &g[5]; // Whoops, off by one. }
&g [5]可能是你进程中的一个有效指针,并且可能指向somethingElse,你将能够访问它而不会崩溃但是写入它会破坏你的状态.
你真正的问题是你正在调用一个返回错误指针的函数.你有权访问它的源代码吗?90%的时间我遇到过这样的问题,这是因为:
1)该函数返回指向堆栈的指针; 例如,
char a[10]; ... return a;
2)该函数返回一个从未分配有效内存的指针开头:
char* foo; // Invalid pointer ... return foo;
3)该函数返回一个已删除(或免费)的指针:
char* foo = new char[10]; ... delete[] foo; return foo;
你真的需要找到真正的问题,而不是解决它.