Функции безопасности в 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