_set_invalid_parameter_handler、_set_thread_local_invalid_parameter_handler_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler

CRT が無効な引数を検出したときに呼び出される関数を設定します。Sets a function to be called when the CRT detects an invalid argument.

構文Syntax

_invalid_parameter_handler _set_invalid_parameter_handler(
   _invalid_parameter_handler pNew
);
_invalid_parameter_handler _set_thread_local_invalid_parameter_handler(
   _invalid_parameter_handler pNew
);

パラメーターParameters

pNewpNew
新しい無効なパラメーター ハンドラーへの関数ポインターです。The function pointer to the new invalid parameter handler.

戻り値Return Value

呼び出し前の無効なパラメーター ハンドラーへのポインターです。A pointer to the invalid parameter handler before the call.

RemarksRemarks

多くの C ランタイム関数では、渡された引数の有効性を確認しています。Many C runtime functions check the validity of arguments passed to them. 無効な引数が渡された場合、関数はerrnoエラー番号を設定するか、エラーコードを返すことができます。If an invalid argument is passed, the function can set the errno error number or return an error code. このような場合、無効なパラメーター ハンドラーも呼び出されます。In such cases, the invalid parameter handler is also called. C ランタイムでは、プログラムを終了してランタイム エラー メッセージを表示する、既定のグローバルの無効なパラメーター ハンドラーを提供しています。The C runtime supplies a default global invalid parameter handler that terminates the program and displays a runtime error message. _Set_invalid_parameter_handlerを使用して、独自の関数をグローバルの無効なパラメーターハンドラーとして設定できます。You can use the _set_invalid_parameter_handler to set your own function as the global invalid parameter handler. C ランタイムでは、スレッド ローカルの無効なパラメーター ハンドラーもサポートしています。The C runtime also supports a thread-local invalid parameter handler. スレッドローカルパラメーターハンドラーが _set_thread_local_invalid_parameter_handlerを使用してスレッドで設定されている場合、スレッドから呼び出された C ランタイム関数は、グローバルハンドラーではなく、そのハンドラーを使用します。If a thread-local parameter handler is set in a thread by using _set_thread_local_invalid_parameter_handler, the C runtime functions called from the thread use that handler instead of the global handler. グローバルの無効な引数ハンドラーとしては、同時に 1 つの関数しか指定できません。Only one function can be specified as the global invalid argument handler at a time. 1 つのスレッド内では 1 つの関数しかスレッド ローカルの無効な引数ハンドラーとして指定できませんが、別のスレッドでは別のスレッド ローカルなハンドラーを持つことができます。Only one function can be specified as the thread-local invalid argument handler per thread, but different threads can have different thread-local handlers. これにより、コードの一部で使用するハンドラーを、他のスレッドの動作に影響を与えずに変更できます。This allows you to change the handler used in one part of your code without affecting the behavior of other threads.

通常、ランタイムが無効なパラメーター関数を呼び出したということは、回復不可能なエラーが発生したことを意味します。When the runtime calls the invalid parameter function, it usually means that a nonrecoverable error occurred. 提供する無効なパラメーター ハンドラー関数は、保存できるデータを保存してから中止処理をしなければなりません。The invalid parameter handler function you supply should save any data it can and then abort. エラーが回復可能であるという確信を持てない限り、main 関数に制御を返すべきではありません。It should not return control to the main function unless you are confident that the error is recoverable.

無効なパラメーター ハンドラー関数には以下のプロトタイプが必要です。The invalid parameter handler function must have the following prototype:

void _invalid_parameter(
   const wchar_t * expression,
   const wchar_t * function,
   const wchar_t * file,
   unsigned int line,
   uintptr_t pReserved
);

Expression引数は、エラーを発生させた引数式のワイド文字列表現です。The expression argument is a wide string representation of the argument expression that raised the error. 関数の引数は、無効な引数を受け取った CRT 関数の名前です。The function argument is the name of the CRT function that received the invalid argument. File引数は、関数を含む CRT ソースファイルの名前です。The file argument is the name of the CRT source file that contains the function. Line引数は、そのファイル内の行番号です。The line argument is the line number in that file. 最後の引数は予約済みです。The last argument is reserved. CRT ライブラリのデバッグバージョンが使用されていない場合、パラメーターの値はすべてNULLになります。The parameters all have the value NULL unless a debug version of the CRT library is used.

要件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
_set_invalid_parameter_handler_set_thread_local_invalid_parameter_handler_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler C: <stdlib.h>C: <stdlib.h>

C++: <cstdlib> または <stdlib.h>C++: <cstdlib> or <stdlib.h>

_Set_invalid_parameter_handler関数と _set_thread_local_invalid_parameter_handler関数は、Microsoft 固有の関数です。The _set_invalid_parameter_handler and _set_thread_local_invalid_parameter_handler functions are Microsoft-specific. 互換性の詳細については、「 互換性」を参照してください。For compatibility information, see Compatibility.

使用例Example

次の例では、無効なパラメーターを受け取った関数および CRT ソースのファイル名と行番号を出力するために、無効なパラメーター エラー ハンドラーが使用されています。In the following example, an invalid parameter error handler is used to print the function that received the invalid parameter and the file and line in CRT sources. デバッグ CRT ライブラリを使用した場合、無効なパラメーター エラーによってアサーションも発生しますが、この例では _CrtSetReportMode を使用してアサーションが無効化されています。When the debug CRT library is used, invalid parameter errors also raise an assertion, which is disabled in this example using _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

参照See also

_get_invalid_parameter_handler、_get_thread_local_invalid_parameter_handler_get_invalid_parameter_handler, _get_thread_local_invalid_parameter_handler
CRT 関数のセキュリティが強化されたバージョンSecurity-Enhanced Versions of CRT Functions
errno、_doserrno、_sys_errlist、および _sys_nerrerrno, _doserrno, _sys_errlist, and _sys_nerr