Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Многие старые функции 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