Функции безопасности в CRT
Многие старые функции CRT имеют новые более безопасные версии. Если безопасная функция существует, то старая менее безопасная версия помечена как нерекомендуемая, а новая версия имеет суффикс _s ("secure" — "безопасный").
В этом контексте "не рекомендуемая" означает только то, что использование этой функции не рекомендуется; это не означает, что функцию планируется удалить из CRT.
Безопасные функции не предотвращают или исправляют ошибки безопасности; вместо этого они перехватывают ошибки при их возникновении. Они выполняют дополнительные проверки на выполнение условий возникновения ошибки, а в случае ошибки вызывают обработчик ошибок (см. Проверка параметров).
Например, функция strcpy не может сообщить о том, что копируемая строка слишком велика для буфера назначения. Однако ее безопасный аналог, strcpy_s, принимает размер буфера в качестве одного из параметров, так что она может определить, произойдет ли переполнение буфера. Использование strcpy_s для копирования одиннадцати символов в буфер из десяти символов является вашей ошибкой; strcpy_s не может устранить пользовательскую ошибку, но она может обнаружить эти ошибки и предупредить о них путем вызова обработчика недопустимого параметра.
Удаление предупреждений о нерекомендуемых функциях
Существует несколько способов удаления предупреждений о нерекомендуемых функциях для старых менее безопасных функций. Самый простой — указать _CRT_SECURE_NO_WARNINGS или использовать директиву pragma warning. Предупреждения о нерекомендуемых функциях будут отключены, но, разумеется, сами проблемы безопасности, которые вызвали эти предупреждения, останутся. Гораздо лучше оставить предупреждения о нерекомендуемых функциях включенными и использовать новые безопасные функции 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. Для получения дополнительной информации см. Deprecated CRT Functions.
Дополнительные возможности безопасности
Некоторые возможности безопасности включают в себя:
Parameter Validation. Параметры, переданные в функции CRT, проверяются и в безопасных функциях, и во многих существовавших ранее версиях функций. Эти проверки включают в себя:
Проверка на значение NULL, переданное в функции.
Проверка допустимости перечислимых значений.
Проверка принадлежности целочисленных значений допустимым диапазонам.
Для получения дополнительной информации см. Проверка параметров.
Обработчик недопустимых параметров также доступен разработчику. После обнаружения недопустимого параметра, вместо использования утверждений и выхода из приложения, CRT предоставляет способ проверить возникшие проблемы функцией _set_invalid_parameter_handler.
Sized Buffers. Безопасные функции требуют передачи размера буфера в любую функцию, которая пишет в буфер. Безопасные версии проверяют, что буфер достаточно велик, перед записью в него, это помогает избежать опасных ошибок переполнений буфера, которые могут допустить выполнение вредоносного кода. Обычно эти функции возвращают тип кода ошибки errno и вызывают обработчик недопустимого параметра, если размер буфера слишком мал. Функции, читающие данные из буферов ввода, например gets, имеют безопасные версии, в которых требуется указать максимальный размер.
Null termination. Некоторые функции, которые могут оставить строку незавершенной, имеют безопасные версии, гарантирующие, что строки правильно завершаются нулевым символом.
Enhanced error reporting. Коды ошибок, возвращаемые безопасными функциями, содержат более подробные сведения об ошибке, чем существовавшие ранее функции. Безопасные функции и многие функции существовавшие ранее функции сейчас устанавливают errno и часто также возвращают тип кода errno, чтобы обеспечить лучшие отчеты об ошибках.
Filesystem security. API безопасного файлового ввода-вывод по умолчанию защищает доступ к файлам.
Windows security. Безопасное API для работы с процессами принудительно активирует политику безопасности и позволяет указать ACL.
Format string syntax checking. Обнаружены недопустимые строки, например, использование некорректных символов поля типа в строке формата printf.
См. также
Ссылки
Безопасные перегрузки шаблонов