4

memcpyが存在しないメモリ ロケーションにアクセスしようとして失敗するというクラッシュの問題をデバッグしようとしています。以下は、問題コードの縮小版です。

void func_foo(int **a) {
   int *b, c;
   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//this crashes because address "b" is not accessible.
}

私の質問は次のとおりです: を試みる前にメモリにアクセスできるかどうかを確認する方法はありますかmemcpy、またはここでクラッシュを防ぐための別の保護メカニズムはありますか? この場合、チェックしない**aとクラッシュも発生しますか?

4

2 に答える 2

2

ポインターが有効なアクセス可能なメモリを指しているかどうかをプログラムでテストする、移植可能な方法はありません。

これは、ポインタが指していたメモリが解放されて初期化されたときにポインタを常に NULL に設定することを強く推奨する方法の 1 つの理由です。

Would not checking **a cause a crash as well in this case?

ここで行っているのは、渡された値をローカルに割り当ててから、それにアクセスしようとすることだけです。ローカルが悪い場合は、渡された値が悪いためです。ガベージイン、ガベージアウト。


あなたが提供したコードに対処するには:

   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//you really shouldn't be executing this at all unless
                              // you're setting b, so it should be within the if check 
                              // and only executed after b=*a
于 2013-06-03T19:27:21.457 に答える