_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 つの部分で使用されるハンドラーを変更できます。

通常、ランタイムが無効なパラメーター関数を呼び出したということは、回復不可能なエラーが発生したことを意味します。 提供する無効なパラメーター ハンドラー関数は、保存できるデータを保存してから中止処理をしなければなりません。 エラーが回復可能であるという確信がない限り、メイン関数に制御を返すべきではありません。

無効なパラメーター ハンドラー関数には以下のプロトタイプが必要です。

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