Crt secure no warnings c как подключить visual studio

Обновлено: 02.07.2024

Your code uses a function, class member, variable, or typedef that's marked deprecated. Symbols are deprecated by using a __declspec(deprecated) modifier, or the C++14 [[deprecated]] attribute. The actual C4996 warning message is specified by the deprecated modifier or attribute of the declaration.

This warning is always a deliberate message from the author of the header file that declares the symbol. Don't use the deprecated symbol without understanding the consequences.

Remarks

Many functions, member functions, template functions, and global variables in Visual Studio libraries are deprecated. Some, such as POSIX and Microsoft-specific functions, are deprecated because they now have a different preferred name. Some C runtime library functions are deprecated because they're insecure and have a more secure variant. Others are deprecated because they're obsolete. The deprecation messages usually include a suggested replacement for the deprecated function or global variable.

Turn off the warning

To fix a C4996 issue, we usually recommend you change your code. Use the suggested functions and global variables instead. If you need to use the existing functions or variables for portability reasons, you can turn off the warning.

Turn off the warning for a specific line of code

Turn off the warning within a file

Turn off the warning in command-line builds

To turn off the warning globally in command-line builds, use the /wd4996 command-line option.

Turn off the warning for a project in Visual Studio

To turn off the warning for an entire project in the Visual Studio IDE:

Open the Property Pages dialog for your project. For information on how to use the Property Pages dialog, see Property Pages.

Select the Configuration Properties > C/C++ > Advanced property page.

Edit the Disable Specific Warnings property to add 4996 . Choose OK to apply your changes.

Disable the warning using preprocessor macros

You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. These macros are described below.

To define a preprocessor macro in Visual Studio:

Open the Property Pages dialog for your project. For information on how to use the Property Pages dialog, see Property Pages.

Expand Configuration Properties > C/C++ > Preprocessor.

In the Preprocessor Definitions property, add the macro name. Choose OK to save, and then rebuild your project.

Here are some of the common sources of C4996 warnings and errors:

POSIX function names

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Microsoft renamed some POSIX and Microsoft-specific library functions in the CRT to conform with C99 and C++03 constraints on reserved and global implementation-defined names. Only the names are deprecated, not the functions themselves. In most cases, a leading underscore was added to the function name to create a conforming name. The compiler issues a deprecation warning for the original function name, and suggests the preferred name.

To fix this issue, we usually recommend you change your code to use the suggested function names instead. However, the updated names are Microsoft-specific. If you need to use the existing function names for portability reasons, you can turn off these warnings. The functions are still available in the library under their original names.

To turn off deprecation warnings for these functions, define the preprocessor macro _CRT_NONSTDC_NO_WARNINGS . You can define this macro at the command line by including the option /D_CRT_NONSTDC_NO_WARNINGS .

Unsafe CRT Library functions

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available. Most of the deprecated functions allow unchecked read or write access to buffers. Their misuse can lead to serious security issues. The compiler issues a deprecation warning for these functions, and suggests the preferred function.

To fix this issue, we recommend you use the function or variable safe-version instead. Sometimes you can't, for portability or backwards compatibility reasons. Carefully verify it's not possible for a buffer overwrite or overread to occur in your code. Then, you can turn off the warning.

To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS .

To turn off warnings about deprecated global variables, define _CRT_SECURE_NO_WARNINGS_GLOBALS .

For more information about these deprecated functions and globals, see Security Features in the CRT and Safe Libraries: C++ Standard Library.

Unsafe Standard Library functions

'std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

In Visual Studio 2015, this warning appears in debug builds because certain C++ Standard Library template functions don't check parameters for correctness. Often it's because not enough information is available to the function to check container bounds. Or, because iterators may be used incorrectly with the function. This warning helps you identify these functions, because they may be a source of serious security holes in your program. For more information, see Checked iterators.

For example, this warning appears in Debug mode if you pass an element pointer to std::copy , instead of a plain array. To fix this issue, use an appropriately declared array, so the library can check the array extents and do bounds checking.

Several standard library algorithms were updated to have "dual range" versions in C++14. If you use the dual range versions, the second range provides the necessary bounds checking:

This example demonstrates several more ways the standard library may be used to check iterator usage, and when unchecked usage may be dangerous:

If you've verified that your code can't have a buffer-overrun error, you can turn off this warning. To turn off warnings for these functions, define _SCL_SECURE_NO_WARNINGS .

Checked iterators enabled

C4996 can also occur if you don't use a checked iterator when _ITERATOR_DEBUG_LEVEL is defined as 1 or 2. It's set to 2 by default for debug mode builds, and to 0 for retail builds. For more information, see Checked iterators.

Unsafe MFC or ATL code

C4996 can occur if you use MFC or ATL functions that were deprecated for security reasons.

To fix this issue, we strongly recommend you change your code to use updated functions instead.

For information on how to suppress these warnings, see _AFX_SECURE_NO_WARNINGS .

Obsolete CRT functions and variables

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Some library functions and global variables are deprecated as obsolete. These functions and variables may be removed in a future version of the library. The compiler issues a deprecation warning for these items, and suggests the preferred alternative.

To fix this issue, we recommend you change your code to use the suggested function or variable.

To turn off deprecation warnings for these items, define _CRT_OBSOLETE_NO_WARNINGS . For more information, see the documentation for the deprecated function or variable.

Marshaling errors in CLR code

C4996 can also occur when you use the CLR marshaling library. In this case, C4996 is an error, not a warning. The error occurs when you use marshal_as to convert between two data types that require a marshal_context Class. You can also receive this error when the marshaling library doesn't support a conversion. For more information about the marshaling library, see Overview of marshaling in C++.

This example generates C4996 because the marshaling library requires a context to convert from a System::String to a const char * .

Example: User-defined deprecated function

You can use the deprecated attribute in your own code to warn callers when you no longer recommend use of certain functions. In this example, C4996 is generated in two places: One for the line the deprecated function is declared on, and one for the line where the function is used.

I find myself repeatedly creating new projects for solving programming contests and it is really annoying (and takes valuable time) to add:

In the beginning of the code, or to set it in the precompiler options every time I start a new project.

7,158 19 19 gold badges 66 66 silver badges 86 86 bronze badges 2,361 2 2 gold badges 13 13 silver badges 8 8 bronze badges You can export a project template with _CRT_SECURE_NO_WARNINGS defined.

7 Answers 7

Mark all the desired projects in solution explorer.

Press Alt-F7 or right click in solution explorer and select "Properties"

Click on the Preprocessor Definitions line to invoke its editor

Copy "_CRT_SECURE_NO_WARNINGS" into the Preprocessor Definitions white box on the top.

enter image description here


4,487 6 6 gold badges 33 33 silver badges 41 41 bronze badges 4,313 1 1 gold badge 16 16 silver badges 17 17 bronze badges This only describes the first step. Once you have configured everything the way you need it, you will want to export a project template as well (see How to: Create project templates for instructions).

It may have been because I am still new to VS and definitely new to C, but the only thing that allowed me to build was adding

At the top of my file, this suppressed the C4996 error I was getting with sprintf

A bit annoying but perfect for my tiny bit of code and by far the easiest.


2,531 3 3 gold badges 19 19 silver badges 26 26 bronze badges Had the exact same thing - it feels shitty but at the end of the day, well f*** it, it works @Spike0xff @ShitalShah Is your confirmation based on personal experiments or some official Microsoft documentation?

Not automatically, no. You can create a project template as BlueWandered suggested or create a custom property sheet that you can use for your current and all future projects.

  1. Open up the Property Manager (View->Property Manager)
  2. In the Property Manager Right click on your project and select "Add New Project Property Sheet"
  3. Give it a name and create it in a common directory. The property sheet will be added to all build targets.
  4. Right click on the new property sheet and select "Properties". This will open up the properties and allow you to change the settings just like you would if you were editing them for a project.
  5. Go into "Common Properties->C/C++->Preprocessor"
  6. Edit the setting "Preprocessor Definitions" and add _CRT_SECURE_NO_WARNINGS .
  7. Save and you're done.

Now any time you create a new project, add this property sheet like so.

  1. Open up the Property Manager (View->Property Manager)
  2. In the Property Manager Right click on your project and select "Add Existing Project Property Sheet"

The benefit here is that not only do you get a single place to manage common settings but anytime you change the settings they get propagated to ALL projects that use it. This is handy if you have a lot of settings like _CRT_SECURE_NO_WARNINGS or libraries like Boost that you want to use in your projects.

Remarks

Отключить предупреждение

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

Отключение предупреждения для определенной строки кода

Отключение предупреждения в файле

Отключение предупреждения в сборках из командной строки

Чтобы отключить предупреждение глобально в сборках командной строки, используйте /wd4996 параметр командной строки.

Отключение предупреждения для проекта в Visual Studio

чтобы отключить предупреждение для всего проекта в Visual Studio IDE, выполните следующие действия.

Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.

Выберите страницу свойств свойства конфигурации > C/C++ > Дополнительно .

Отключение предупреждения с помощью макросов препроцессора

Вы также можете использовать макросы препроцессора, чтобы отключить некоторые определенные классы предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.

Чтобы определить макрос препроцессора в Visual Studio:

Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.

Разверните Свойства конфигурации > препроцессора > C/C++.

Ниже приведены некоторые из распространенных источников предупреждений и ошибок C4996:

Имена функций POSIX

The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.

Корпорация Майкрософт переименовала некоторые библиотечные функции POSIX и Microsoft в CRT, чтобы они соответствовали ограничениям C99 и C++ 03 в зарезервированных и глобальных именах, определяемых реализацией. Только имена являются устаревшими, а не сами функции. В большинстве случаев в имя функции добавляется символ подчеркивания для создания имени. Компилятор выдает предупреждение об устаревании для имени исходной функции и предлагает предпочтительное имя.

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

Чтобы отключить предупреждения об устаревании для этих функций, определите макрос препроцессора _CRT_NONSTDC_NO_WARNINGS . Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .

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

This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

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

Чтобы устранить эту проблему, рекомендуется вместо этого использовать функцию или переменную safe-version . Иногда вы не можете обеспечить переносимость или обратную совместимость. Тщательно проверьте, не возможно ли перезапись или Пересчитывание буфера в коде. После этого предупреждение можно отключить.

Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .

Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .

дополнительные сведения об этих устаревших функциях и глобальных параметрах см. в разделе функции безопасности в библиотеках CRT и Сейф: стандартная библиотека C++.

Ненадежные функции стандартной библиотеки

'std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

в Visual Studio 2015 это предупреждение появляется в отладочных сборках, так как некоторые функции шаблона стандартной библиотеки C++ не проверяют правильность параметров. Часто это обусловлено тем, что функции не хватает информации для проверки границ контейнера. Или, так как итераторы могут неправильно использоваться функцией. Это предупреждение помогает понять эти функции, так как они могут быть источником серьезных брешей в системе безопасности в программе. Дополнительные сведения см. в разделе проверенные итераторы.

Например, это предупреждение отображается в режиме отладки std::copy , если вместо простого массива передается указатель на элемент. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека могла проверять экстенты массива и проверять границы.

Несколько стандартных алгоритмов библиотеки были обновлены в версии C++ 14 с двумя диапазонами. При использовании двух версий диапазона второй диапазон предоставляет необходимые проверки границ:

В этом примере показано несколько способов использования стандартной библиотеки для проверки использования итератора, и если непроверенное использование может быть опасным:

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

Проверенные итераторы включены

Предупреждение C4996 также может возникать, если не используется проверяемый итератор, если _ITERATOR_DEBUG_LEVEL определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — 0. Дополнительные сведения см. в разделе проверенные итераторы.

Ненадежный код MFC или ATL

Предупреждение C4996 может возникать при использовании функций MFC или ATL, которые являются устаревшими по соображениям безопасности.

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

Сведения о подавлении этих предупреждений см. в разделе _AFX_SECURE_NO_WARNINGS .

Устаревшие функции и переменные CRT

This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.

Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.

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

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

Ошибки маршалирования в коде CLR

Предупреждение C4996 также может возникать при использовании библиотеки маршалирования CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при использовании marshal_as для преобразования между двумя типами данных, для которых требуется marshal_context класс. Эту ошибку также можно получить, когда библиотека упаковки не поддерживает преобразование. Дополнительные сведения о библиотеке упаковки см. в разделе Общие сведения о маршалировании в C++.

Этот пример приводит к возникновению предупреждения C4996, поскольку библиотеке маршалирования требуется контекст для преобразования из в System::String const char * .

Пример: определяемая пользователем устаревшая функция

Атрибут можно использовать deprecated в собственном коде для предупреждения вызывающих объектов, когда больше не рекомендуется использовать определенные функции. В этом примере C4996 создается в двух местах: по одному для строки, для которой объявлена устаревшая функция, а другая — для строки, в которой используется функция.

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

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

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

Устранение предупреждений о нерекомендуемых функциях

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

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

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

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

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

Дополнительные средства безопасности

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

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

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

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

Разработчику также доступен обработчик недопустимого параметра. Если функция обнаруживает недопустимый параметр, вместо утверждения и выхода приложения CRT позволяет проверять эти проблемы с помощью _set_invalid_parameter_handler, _set_thread_local_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 .

Visual Studio unsafe error скриншот

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!

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

Попробовав выполнить сборку проекта, обнаружим те самые ошибки.

Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:

1. Выберем пункт "Проект" в верхнем меню

2. В открывшемся списке щёлкнем по "Свойства название_проекта"

Программа, вводящая два числа и выводящая их

Ошибка компиляции из-за небезопасности функций


3. В появившемся окне выберем Свойства конфигурации , C/C++ , Препроцессор

4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS

Свойства конфигурации

Определения препроцессора

OK

6. Попробуем заново выполнить сборку проекта:

Успешная сборка проекта

Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!

Фото Перминова Андрея, автора этой статьи

Выпускник МГУ им. М.В. Ломоносова

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

Читайте также: