Compartir a través de


_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler

Establece una función a la que se llamará cuando CRT detecte un argumento no válido.

Sintaxis

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

Parámetros

pNew
El puntero de función al nuevo controlador de parámetros no válidos.

Valor devuelto

Puntero al controlador de parámetros no válidos antes de la llamada.

Comentarios

Muchas funciones de tiempo de ejecución de C comprueban la validez de los argumentos pasados. Si se pasa un argumento no válido, la función puede establecer el número de error errno o devolver un código de error. En estos casos, también se llama al controlador de parámetros no válidos. El tiempo de ejecución de C proporciona un controlador de parámetros no válidos global predeterminado que finaliza el programa y muestra un mensaje de error en tiempo de ejecución. Puede usar _set_invalid_parameter_handler para establecer su propia función como controlador de parámetros no válidos global. El tiempo de ejecución de C también admite un controlador de parámetros no válidos de subproceso local. Si se establece un controlador de parámetros de subproceso local en un subproceso mediante _set_thread_local_invalid_parameter_handler, las funciones de tiempo de ejecución de C a las que se llama desde el subproceso usan este controlador en lugar de usar el controlador global. Solo se puede especificar una función a la vez como controlador global de argumentos no válidos. Solo se puede especificar una función como controlador de argumentos no válidos de subproceso local por cada subproceso, aunque puede haber diferentes subprocesos que tengan diferentes controladores de subproceso local. Los controladores locales de subprocesos permiten cambiar el controlador usado en una parte del código sin afectar al comportamiento de otros subprocesos.

Cuando el tiempo de ejecución llama a la función de parámetro no válido, suele significar que se ha producido un error irrecuperable. La función del controlador de parámetros no válidos que proporcione debe guardar todos los datos que pueda contener y luego debe anularse. No debe devolver el control a la función principal a menos que esté seguro de que el error se puede recuperar.

La función de controlador de parámetros no válidos debe tener el siguiente prototipo:

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

El argumento expression es una representación de cadena de caracteres anchos de la expresión de argumento que provocó el error. El argumento function es el nombre de la función de CRT que recibió el argumento no válido. El argumento file es el nombre del archivo de origen de CRT que contiene la función. El argumento line es el número de línea de ese archivo. Se reserva el último argumento. Todos los parámetros tienen el valor NULL, a menos que se use una versión de depuración de la biblioteca de CRT.

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Requisitos

Routine Encabezado necesario
_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler C: <stdlib.h>

C++: <cstdlib> o <stdlib.h>

Las funciones _set_invalid_parameter_handler y _set_thread_local_invalid_parameter_handler son específicas de Microsoft. Para obtener información sobre la compatibilidad, consulte Compatibilidad.

Ejemplo

En el ejemplo siguiente se usa un controlador de errores de parámetros no válidos para imprimir la función que recibió el parámetro no válido, así como el archivo y la línea en los orígenes de CRT. Cuando se usa la biblioteca de CRT de depuración, los errores de parámetro no válidos también generan una aserción, que se deshabilita en este ejemplo mediante _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

Consulte también

_get_invalid_parameter_handler, _get_thread_local_invalid_parameter_handler
Versiones mejoradas de seguridad de las funciones de CRT
errno, _doserrno, _sys_errlist y _sys_nerr.