Поделиться через


Функции безопасности в CRT

Многие старые функции CRT имеют более новые, более безопасные версии. Если существует безопасная функция, более старая, менее безопасная версия помечена как нерекомендуемая. Новая версия имеет _s суффикс (secure).

В этом контексте "не рекомендуется" означает, что использование функции не рекомендуется. Это не означает, что функция будет удалена из CRT.

Безопасные функции не предотвращают или не исправляют ошибки безопасности. Они наоборот перехватывают ошибки при их возникновении. Они выполняют дополнительные проверки на наличие ошибок. Если возникает ошибка, они вызывают обработчик ошибок (см. проверку параметров).

Например, функция strcpy не может определить, слишком ли велика копируемая строка для целевого буфера. Его безопасный аналог strcpy_sпринимает размер буфера в качестве параметра. Таким образом, он может определить, произойдет ли переполнение буфера. Если вы используете strcpy_s для копирования 11 символов в буфер размером 10 символов, это ваша ошибка; strcpy_s не сможет исправить вашу ошибку. Но он может обнаружить ошибку и сообщить вам, вызвав обработчик недопустимых параметров.

Устранение предупреждений об устаревании

Существует несколько способов устранения предупреждений об устаревании для более старых, менее безопасных функций. Проще всего определить _CRT_SECURE_NO_WARNINGS или использовать warning pragma. Отключает предупреждения об устаревании, но проблемы безопасности, вызвавшие эти предупреждения, по-прежнему существуют. Рекомендуется оставить включенными предупреждения о снятии с поддержки и воспользоваться новыми функциями безопасности CRT.

В C++ проще всего убрать предупреждения об устаревании, используя безопасные перегрузки шаблонов. Во многих случаях перегрузки устраняют предупреждения об устаревании. Они заменяют вызовы устаревших функций вызовами для безопасных версий функций. Например, рассмотрим этот устаревший вызов strcpy:

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

Определение _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES как 1 устраняет предупреждение, изменяя вызов strcpy на strcpy_s, что предотвращает переполнение буфера. Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".

Для этих устаревших функций без безопасных перегрузок шаблонов необходимо обязательно вручную обновить код, чтобы использовать безопасные версии.

Другим источником предупреждений об устаревании, не связанных с безопасностью, является функция POSIX. Замените имена функций POSIX их стандартными эквивалентами (например, измените access на _access) или отключите предупреждения о прекращении использования POSIX, определив _CRT_NONSTDC_NO_WARNINGS. Дополнительные сведения см. в разделе "Совместимость".

Дополнительные функции безопасности

Ниже перечислены некоторые функции безопасности:

  • Проверка параметров

    Безопасные функции и многие из их небезопасных аналогов проверяют параметры. Проверка может включать:

    • Проверка значений NULL .
    • Проверка перечисленных значений для допустимости.
    • Проверка того, что целочисленные значения находятся в допустимых диапазонах.

    Дополнительные сведения см. в разделе "Проверка параметров".

    Обработчик недопустимых параметров также доступен для разработчика. Если функция обнаруживает недопустимый параметр, вместо утверждения и выхода из приложения, CRT позволяет проверять эти проблемы с помощью _set_invalid_parameter_handler или _set_thread_local_invalid_parameter_handler.

  • Буферы с заданным размером

    Необходимо передать размер буфера в любую безопасную функцию, которая записывает в буфер. Безопасные версии проверяют, что буфер достаточно велик перед записью в него. Проверка помогает избежать опасных ошибок переполнения буфера, которые могут позволить выполнять вредоносный код. Обычно эти функции возвращают errno код ошибки и вызывают обработчик недопустимых параметров, если размер буфера слишком мал. Функции, которые считываются из входных буферов, например gets, имеют безопасные версии, требующие указания максимального размера.

    Отладочные версии некоторых функций CRT с усиленной безопасностью заполняют буфер, переданный им, специальным символом (0xFE). Этот символ заливки помогает найти случаи, когда неверный размер передавался в функцию. К сожалению, это также снижает производительность. Чтобы повысить производительность, используйте _CrtSetDebugFillThreshold для отключения заполнения буфера. Дополнительные сведения и список функций, имеющих такое поведение, см. в разделе _CrtSetDebugFillThreshold.

  • Завершение нулевым символом

    Некоторые функции, которые могут оставлять строки без завершения нулевым символом, имеют безопасные версии, обеспечивающие их правильное завершение.

  • Расширенные отчеты об ошибках

    Защищенные функции возвращают коды ошибок с дополнительными сведениями об ошибках, чем доступны в предустановленных функциях. Безопасные функции и многие из уже существующих функций теперь задают errno и часто возвращают код типа errno, для улучшения сообщении об ошибках.

  • Безопасность файловой системы

    Api безопасного ввода-вывода файлов поддерживают безопасный доступ к файлам в случае по умолчанию.

  • Безопасность Windows

    API безопасных процессов обеспечивают политику безопасности и позволяют добавлять списки управления доступом.

  • Проверка синтаксиса строк формата

    Недопустимые строки обнаруживаются, например, при использовании неправильных символов полей типа в printf строках форматирования.

См. также

Проверка параметров
Безопасные перегрузки шаблонов
Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib