パラメーターの検証
セキュリティが強化された CRT 関数のほとんどとそうでない多くは、 NULL
のポインターのチェック、整数が有効な範囲に分類されていること、または列挙値が有効であることを示すパラメーターを検証します。 無効なパラメーターが見つかった場合は、無効なパラメーター ハンドラーが呼び出されます。
パラメーター ハンドラー ルーチンが無効です
C ランタイム ライブラリ関数では、無効なパラメーターを検出して、エラーに関する情報をキャプチャし、無効なパラメーター ハンドラーのディスパッチ関数をラップするマクロを呼び出します。 これは、 _invalid_parameter
、 _invalid_parameter_noinfo
、または _invalid_parameter_noinfo_noreturn
のいずれかになります。 呼び出されるディスパッチ関数は、コードがそれぞれデバッグ ビルドであるか、製品ビルドであるか、エラーが回復可能とは見なされないかに応じて異なります。
デバッグ ビルドでは、通常は、無効なパラメーター マクロによって、ディスパッチ関数が呼び出される前に、失敗したアサーションおよびデバッガー ブレークポイントが呼び出されます。 コードを実行すると、オペレーティング システムと CRT のバージョンに依存する "Abort"、"Retry"、"Continue" などの選択肢があるダイアログ ボックスで、アサーションがユーザーに報告されることがあります。 これらのオプションを使用すると、ユーザーはすぐにプログラムを終了するか、デバッガーをアタッチするか、既存のコードを継続的に実行してディスパッチ関数を呼び出すかを選択できます。
無効なパラメーター ハンドラーのディスパッチ関数では、現在割り当てられている無効なパラメーター ハンドラーを呼び出します。 既定では、無効なパラメーターの場合に _invoke_watson
が呼び出されます。これにより、アプリケーションが閉じられ、ミニ ダンプが生成されます。 オペレーティング システムで有効にされている場合は、分析のために Microsoft にクラッシュ ダンプを送信するかどうかをユーザーに尋ねるダイアログ ボックスが表示されます。
この動作を変更するには、関数 _set_invalid_parameter_handler
を使用するか、 _set_thread_local_invalid_parameter_handler
を使用して、無効なパラメーター ハンドラーを独自の関数に設定します。 指定した関数がアプリケーションを終了しない場合、無効なパラメーターを受け取った関数に制御が返されます。 CRT では、通常、これらの関数では関数の実行を停止し、errno
をエラー コードに設定し、エラー コードを返します。 多くの場合、errno
値と戻り値はどちらも無効なパラメーターを示す EINVAL
です。 場合によっては、より具体的なエラー コードが返されます。たとえば、無効なファイル ポインターがパラメーターとして渡された場合の EBADF
などです。
errno
の詳細については、「errno
、_doserrno
、_sys_errlist
、および_sys_nerr
」を参照してください。