Compartir vía


Sobrecargas de plantillas seguras

Microsoft ha dejado de usar muchas funciones de la biblioteca en tiempo de ejecución (CRT) en favor de versiones con seguridad mejorada. Por ejemplo, strcpy_s es la sustitución más segura para strcpy. Las funciones en desuso son orígenes comunes de errores de seguridad, ya que no impiden operaciones que pueden sobrescribir la memoria. De forma predeterminada, el compilador genera una advertencia de desuso cuando se usa una de estas funciones. La biblioteca CRT proporciona sobrecargas de plantilla de C++ para estas funciones con el fin de facilitar la transición a variantes más seguras.

Por ejemplo, este fragmento de código genera una advertencia porque strcpy está en desuso:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

La advertencia de desuso está ahí para indicarle que su código puede no ser seguro. Si ha comprobado que el código no puede sobrescribir la memoria, dispone de varias opciones. Para suprimir la advertencia, puede omitir la advertencia, puede definir el símbolo _CRT_SECURE_NO_WARNINGS antes de incluir las instrucciones "include" para los encabezados de CRT o puede actualizar el código para usar strcpy_s:

char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function

Las sobrecargas de plantilla proporcionan más opciones. Si define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES en 1, habilita las sobrecargas de plantilla de las funciones estándar de CRT que llaman automáticamente a las variantes más seguras. Si _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES es 1, no es necesario ningún cambio en el código. En segundo plano, la llamada a strcpy se cambia a una llamada a strcpy_s con el argumento de tamaño suministrado automáticamente.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

La macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES no afecta a las funciones que toman un recuento, como strncpy. Para habilitar las sobrecargas de plantilla para las funciones de recuento, defina _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT como 1. Antes de hacerlo, sin embargo, asegúrese de que el código pasa el número de caracteres, no el tamaño del búfer (un error común). Además, el código que escribe explícitamente un terminador nulo al final del búfer después de la llamada a la función no es necesario si se llama a la variante segura. Si necesita un comportamiento de truncamiento, consulte _TRUNCATE.

Nota:

La macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT requiere que _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES también se defina como 1. Si _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT se define como 1 y _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES se define como 0, la aplicación no realizará ninguna sobrecarga de plantilla.

Cuando se define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES como 1, se permiten sobrecargas de plantilla de las variantes seguras (nombres que terminan en "_s"). En este caso, si _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES es 1, se debe realizar entonces un pequeño cambio en el código original:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Solo es necesario cambiar el nombre de la función (agregando "_s"); la sobrecarga de plantilla se ocupa de proporciona el argumento de tamaño.

De forma predeterminada, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES y _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT se definen como 0 (deshabilitado) y _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES se define como 1 (habilitado).

Las sobrecargas de plantilla solo funcionan para matrices estáticas. Los búferes asignados dinámicamente requieren otros cambios en el código fuente. Examinando de nuevo los ejemplos anteriores:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; change it to
                       // strcpy_s(szBuf, 10, "test");

Y este ejemplo:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; change it to
                         // strcpy_s(szBuf, 10, "test");

Consulte también

Características de seguridad en CRT
Archivos .lib de tiempo de ejecución de C (CRT) y biblioteca estándar de C++ (STL)