2009-03-25 9 views
3

私はC++で作業していますが、LPVOIDを返すメソッドを呼び出すと問題が発生します。LPVOIDを検証する方法<Bad Ptr>

LPVOID MyMethod(...); 

問題は、この方法が時々悪いのPtrを返し、私は返された値が悪いのPtrであれば、これを検出する方法があるかどうかを知りたいということです。

私はそれが運が無ければNULLかどうか聞いてみました。

結果がBad Ptrであることがわかっている唯一の方法は、私がデバッグしている間に、私はいくつかの方法を試してみましたが、まだそれを行うことができません。

+0

いくつかのコードを入力してください。 – dirkgently

+0

"不良ポインター"を返さないで、それを照らすことができるので代わりにNULLを返します。 –

答えて

10

いいえ、ポインタが悪いかどうかを判断する簡単な方法はありません。

WindowsにはIsBadReadPtr、IsBadWritePtrがあります。これらの関数には本質的に欠陥があります。呼び出しの時点でアドレス空間で関数が読み書き可能かどうかを判断するだけです。それらはまたsecurityissuesの原因でもよく、決して使用しないでください。

主な問題は、プロセスにまだアクセスできる "不良"ポインタと良好なポインタを区別する方法がないことです。例えば

int g[5]; 
int somethingElse; 

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

& gが[5]、おそらくあなたのプロセスで有効なポインタで、somethingElseを指しているかもしれない、あなたはなりクラッシュ、それに書き込むことなく、それをアクセスできるようになりますあなたの状態を壊す。

+0

Raymond Chenのhttp://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx – Eclipse

8

実際の問題は、悪いポインタを返す関数を呼び出していることです。そのソースコードにアクセスできますか?このような問題が発生した時間の90%は、次のいずれかの理由によるものです。

1)関数がスタックへのポインタを返しています。

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

3)関数は「は既に削除されたポインタを返す(または自由さ:例えば、

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

2)関数は、そもそも有効なメモリを割り当てられませんでしたポインタを返しますd):

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

本当に、実際の問題を回避する必要はありません。

1

LPVOIDvoidへのポインタにtypedefで、Visual Studioは、通常の時計ペインの「悪いポインタ」としてNULL値を表示し、このポインタはNULLではないことをあなたは確かにありますか?

+0

NULLは私のマシンにNULLとして表示され、何かが実際にFUBARされているときにが表示されます保持されているアドレスは有効ではありません。 – crashmstr

関連する問題