_set_invalid_parameter_handler
, _set_thread_local_invalid_parameter_handler
CRT が無効な引数を検出したときに呼び出される関数を設定します。
構文
_invalid_parameter_handler _set_invalid_parameter_handler(
_invalid_parameter_handler pNew
);
_invalid_parameter_handler _set_thread_local_invalid_parameter_handler(
_invalid_parameter_handler pNew
);
パラメーター
pNew
新しい無効なパラメーター ハンドラーへの関数ポインターです。
戻り値
呼び出し前の無効なパラメーター ハンドラーへのポインターです。
解説
多くの C ランタイム関数では、渡された引数の有効性を確認しています。 無効な引数を渡された場合、関数では errno
エラー番号を設定するか、エラー コードを返すことができます。 このような場合、無効なパラメーター ハンドラーも呼び出されます。 C ランタイムでは、プログラムを終了してランタイム エラー メッセージを表示する、既定のグローバルの無効なパラメーター ハンドラーを提供しています。 _set_invalid_parameter_handler
を使用すると、独自の関数をグローバルの無効なパラメーター ハンドラーとして設定できます。 C ランタイムでは、スレッド ローカルの無効なパラメーター ハンドラーもサポートしています。 _set_thread_local_invalid_parameter_handler
を使用してスレッド ローカル パラメーター ハンドラーをスレッド内で設定した場合、そのスレッドから呼び出された C ランタイム関数ではグローバル ハンドラーではなくそのハンドラーを使用します。 グローバルの無効な引数ハンドラーとしては、同時に 1 つの関数しか指定できません。 1 つのスレッド内では 1 つの関数しかスレッド ローカルの無効な引数ハンドラーとして指定できませんが、別のスレッドでは別のスレッド ローカルなハンドラーを持つことができます。 スレッド ローカル ハンドラーを使用すると、他のスレッドの動作に影響を与えずに、コードの 1 つの部分で使用されるハンドラーを変更できます。
通常、ランタイムが無効なパラメーター関数を呼び出したということは、回復不可能なエラーが発生したことを意味します。 提供する無効なパラメーター ハンドラー関数は、保存できるデータを保存してから中止処理をしなければなりません。 エラーが回復可能であるという確信がない限り、main 関数に制御を返すべきではありません。
無効なパラメーター ハンドラー関数には以下のプロトタイプが必要です。
void _invalid_parameter(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
unsigned int line,
uintptr_t pReserved
);
expression
引数は、エラーを発生させた引数式のワイド文字列表記です。 function
引数は、無効な引数を受け取った CRT 関数の名前です。 file
引数は、関数を含む CRT ソース ファイルの名前です。 line
引数は、そのファイル内での行番号です。 最後の引数は予約済みです。 CRT ライブラリのデバッグ バージョンが使用されている場合を除き、パラメーターはすべて NULL
値を持ちます。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
_set_invalid_parameter_handler , _set_thread_local_invalid_parameter_handler |
C: <stdlib.h> C++: <cstdlib> または <stdlib.h> |
_set_invalid_parameter_handler
と _set_thread_local_invalid_parameter_handler
は、Microsoft 固有の関数です。 互換性の詳細については、「互換性」を参照してください。
例
次の例では、無効なパラメーターを受け取った関数および CRT ソースのファイル名と行番号を出力するために、無効なパラメーター エラー ハンドラーが使用されています。 デバッグ CRT ライブラリを使用すると、無効なパラメーター エラーによってアサーションも発生します。アサーションは、この例では _CrtSetReportMode
を使用して無効になっています。
// crt_set_invalid_parameter_handler.c
// compile with: /Zi /MTd
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h> // For _CrtSetReportMode
void myInvalidParameterHandler(const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter detected in function %s."
L" File: %s Line: %d\n", function, file, line);
wprintf(L"Expression: %s\n", expression);
abort();
}
int main( )
{
char* formatString;
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
// Call printf_s with invalid parameters.
formatString = NULL;
printf(formatString);
}
Invalid parameter detected in function common_vfprintf. File: minkernel\crts\ucrt\src\appcrt\stdio\output.cpp Line: 32
Expression: format != nullptr
関連項目
_get_invalid_parameter_handler
, _get_thread_local_invalid_parameter_handler
CRT 関数のセキュリティ強化バージョン
errno
、_doserrno
、_sys_errlist
、および _sys_nerr