当前位置:  开发笔记 > 编程语言 > 正文

如何验证LPVOID到<Bad Ptr>

如何解决《如何验证LPVOID到<BadPtr>》经验,为你挑选了2个好方法。

我正在使用C++ unmanaged,当我调用一个返回LPVOID的方法时,我遇到了这个问题.

LPVOID MyMethod(...);

问题是这个方法有时返回Bad Ptr,我想知道是否有一种方法可以检测到这个,如果返回的值是Bad Ptr.

我试过询问它是否为NULL而没有运气.

我知道如果结果是坏Ptr的唯一方法是在我调试时,我尝试了一些不同的方法,但仍然无法做到.



1> Michael..:

不,没有简单的方法来确定指针是否坏.

Windows确实有IsBadReadPtr,IsBadWritePtr.这些函数本质上存在缺陷 - 它们仅在调用时确定函数在地址空间中是否可读或可写.它们也可能是安全 问题的原因,永远不应该使用.

主要问题是没有办法区分仍然可以访问进程的"坏"指针和一个好的指针.

例如,

int g[5];
int somethingElse;

void* GetPointer()
{
   return &g[5]; // Whoops, off by one.
}

&g [5]可能是你进程中的一个有效指针,并且可能指向somethingElse,你将能够访问它而不会崩溃但是写入它会破坏你的状态.



2> Dan Breslau..:

你真正的问题是你正在调用一个返回错误指针的函数.你有权访问它的源代码吗?90%的时间我遇到过这样的问题,这是因为:

1)该函数返回指向堆栈的指针; 例如,

char a[10];
...
return a;

2)该函数返回一个从未分配有效内存的指针开头:

char* foo; // Invalid pointer
 ...
return foo;

3)该函数返回一个已删除(或免费)的指针:

char* foo = new char[10];
...
delete[] foo;
return foo;

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有