Características de seguridad de CRT
Muchas funciones anteriores de CRT tienen versiones nuevas y más seguras. Si existe una función segura, la versión anterior y menos segura se marca como en desuso. La nueva versión tiene el _s
sufijo ("seguro").
En este contexto, "en desuso" significa que no se recomienda el uso de la función. No significa que la función se quite de CRT.
Las funciones seguras no impiden ni corrigen errores de seguridad. En su lugar, detectan errores cuando se producen. Realizan comprobaciones adicionales de las condiciones de error. Si se produce un error, invocan un controlador de errores (consulte Validación de parámetros).
Por ejemplo, la strcpy
función no puede indicar si la cadena que copia es demasiado grande para el búfer de destino. Su equivalente seguro, strcpy_s
, adopta el tamaño del búfer como parámetro. Por lo tanto, puede determinar si se producirá una saturación del búfer. Si usa strcpy_s
para copiar 11 caracteres en un búfer de 10 caracteres, se trata de un error por su parte; strcpy_s
no puede corregir su error. Sin embargo, puede detectar el error e informarle invocando el controlador de parámetros no válidos.
Eliminación de advertencias sobre desuso
Hay varias maneras de eliminar las advertencias sobre desuso de las funciones más antiguas y menos seguras. Lo más sencillo es definir _CRT_SECURE_NO_WARNINGS
o usar la warning
pragma. Cualquiera de los dos deshabilitará las advertencias de desuso, pero los problemas de seguridad que causaron las advertencias siguen existiendo. Es mucho mejor dejar habilitadas las advertencias sobre desuso y beneficiarse de las nuevas características de seguridad de CRT.
En C++, la manera más fácil de eliminar las advertencias de desuso es usar sobrecargas de plantilla seguras. Las sobrecargas eliminan las advertencias de desuso en muchos casos. Reemplazan las llamadas a funciones en desuso por llamadas a versiones seguras de las funciones. Por ejemplo, considere esta llamada en desuso a strcpy
:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Al definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
como 1, se elimina la advertencia cambiando la llamada a strcpy
por strcpy_s
, lo que evita las saturaciones del búfer. Para obtener más información, consulte Sobrecargas de plantillas seguras.
En el caso de estas funciones en desuso sin sobrecargas de plantillas seguras, debe considerar en última instancia actualizar manualmente el código para usar las versiones seguras.
Otro origen de las advertencias sobre desuso, no relacionadas con la seguridad, son las funciones POSIX. Reemplace los nombres de función POSIX por sus equivalentes estándar (por ejemplo, cambie access
a _access
) o deshabilite las advertencias de desuso relacionadas con POSIX definiendo _CRT_NONSTDC_NO_WARNINGS
. Para obtener más información, consulte Compatibilidad.
Más características de seguridad
Entre las características de seguridad, se incluyen las siguientes:
Validación de parámetros
Las funciones seguras y muchos de sus homólogos no seguros validan los parámetros. La validación puede incluir:
- Comprobación de
NULL
los valores. - Comprobar la validez de los valores enumerados.
- Comprobar si los valores de enteros se encuentran en intervalos válidos.
Para obtener más información, consulte Validación de parámetros.
El desarrollador también puede acceder a un controlar de parámetros no válidos. Cuando una función encuentra un parámetro no válido, en lugar de declarar y salir de la aplicación, el CRT le permite comprobar estos problemas a través de o
_set_thread_local_invalid_parameter_handler
._set_invalid_parameter_handler
- Comprobación de
Búferes de tamaño
Debe pasar el tamaño del búfer a cualquier función segura que escriba en un búfer. Las versiones seguras validan que el búfer es lo suficientemente grande antes de escribir en él. La validación ayuda a evitar errores peligrosos de saturación del búfer que podrían permitir la ejecución de código malintencionado. Estas funciones suelen devolver un código de error
errno
e invocar el controlador de parámetros no válidos si el tamaño del búfer es demasiado pequeño. Las funciones que leen de los búferes de entrada, comogets
, tienen versiones seguras que requieren que se especifique un tamaño máximo.Terminación nula
Algunas funciones que dejan cadenas potencialmente sin terminar tienen versiones seguras que garantizan que las cadenas se terminan correctamente en NULL.
Informes de errores mejorados
Las funciones seguras devuelven códigos de error con más información sobre el error de la que estaba disponible con las funciones preexistentes. Las funciones seguras y muchas de las funciones preexistentes ahora establecen
errno
y también suelen devolver un tipo de códigoerrno
, a fin de ofrecer más información sobre los errores.Seguridad del sistema de archivos
Las API de E/S de archivo seguras admiten el acceso seguro a los archivos de forma predeterminada.
Seguridad de Windows
Las API de proceso seguras aplican directivas de seguridad y permiten especificar ACL.
Comprobación de la sintaxis de cadena de formato
Se detectan cadenas no válidas, por ejemplo, cuando se usan caracteres de campo de tipo incorrectos en
printf
cadenas de formato.
Consulte también
Validación de parámetros
Sobrecargas de plantilla seguras
Archivos .lib
de tiempo de ejecución de C (CRT) y biblioteca estándar de C++ (STL)