繁体   English   中英

如何验证LPVOID <Bad Ptr>

[英]How to validate LPVOID to <Bad Ptr>

我正在使用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;

你真的需要找到真正的问题,而不是解决它。

LPVOID是指向void的指针的typedef ,Visual Studio通常在监视窗格中将NULL值显示为“坏指针”,你确定这个指针不是NULL吗?

不,你不能。

但是,如果您可以创建辅助数据结构来存储位置并确保在删除它们时将它们从辅助数据结构中删除(可能将其添加到析构函数中),您可以在取消引用之前检查指针是否在该结构中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM