[英]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.