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

  • 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, como gets, 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ódigo errno, 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)