1. ホーム
  2. c++

[解決済み] ポインタの有効性のテスト(C/C++)

2023-01-15 10:43:39

質問

与えられたポインタが "valid"であるかどうかを (もちろん、プログラム的に) 判断する方法はあるでしょうか? NULL をチェックするのは簡単ですが、0x00001234 のようなものについてはどうでしょうか? この種のポインタをデリファレンスしようとすると、例外やクラッシュが発生します。

クロスプラットフォームな方法が望ましいですが、プラットフォーム固有(WindowsとLinux用)でも大丈夫です。

明確化のための更新です。 問題はstale/freed/uninitializedポインタではなく、呼び出し元からポインタ(文字列へのポインタ、ファイルハンドルなど)を取得するAPIを実装しています。呼び出し元は、(意図的または誤って)無効な値をポインタとして送信することができます。クラッシュを防ぐにはどうしたらよいでしょうか?

どのように解決するのですか?

<ブロッククオート

明確化のための更新です。 問題は、古くなった、解放された、あるいは初期化されていないポインタではなく、呼び出し元からポインタ(文字列へのポインタ、ファイルハンドルなど)を取得するAPIを実装しています。呼び出し元は、(意図的または誤って)無効な値をポインタとして送信することができます。クラッシュを防ぐにはどうしたらよいでしょうか?

そのようなチェックを行うことはできません。ポインタが有効であるかどうかをチェックする方法はありません。人々がポインターを取る関数を使用するとき、その人々は彼らが何をしているかを知っていると信じなければなりません。もしポインタの値として0x4211を渡されたら、それがアドレス0x4211を指していると信じなければなりません。そして、もし彼らが誤ってオブジェクトをヒットしてしまったら、たとえあなたが何か恐ろしいオペレーション システム関数 (IsValidPtr やその他) を使用したとしても、あなたはまだバグに陥ってしまい、すぐに失敗することはないでしょう。

この種のことを知らせるためにヌルポインタを使い始め、ライブラリのユーザーに、誤って無効なポインタを渡しがちな場合はポインタを使うなと伝えましょう、マジで :)