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


Функции безопасности в 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, имеют безопасные версии, требующие указания максимального размера.

  • Завершение null

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

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

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

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

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

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

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

  • Форматирование проверки синтаксиса строки

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

См. также

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