Crt secure no warnings c как подключить visual studio
Many old CRT functions have newer, more secure versions. If a secure function exists, the older, less secure version is marked as deprecated and the new version has the _s ("secure") suffix.
In this context, "deprecated" means using the function's isn't recommended. It doesn't mean the function is scheduled to be removed from the CRT.
The secure functions don't prevent or correct security errors. Instead, they catch errors when they occur. They do additional checks for error conditions. If there is an error, they invoke an error handler (see Parameter Validation).
For example, the strcpy function can't tell if the string it's copying is too large for the destination buffer. Its secure counterpart, strcpy_s , takes the size of the buffer as a parameter. So it can determine if a buffer overrun will occur. If you use strcpy_s to copy 11 characters into a 10 character buffer, that is an error on your part; strcpy_s can't correct your mistake. But it can detect your error and inform you by invoking the invalid parameter handler.
Eliminating deprecation warnings
There are several ways to eliminate deprecation warnings for the older, less secure functions. The simplest is simply to define _CRT_SECURE_NO_WARNINGS or use the warning pragma. Either will disable deprecation warnings, but the security issues that caused the warnings still exist. It's better to leave deprecation warnings enabled and take advantage of the new CRT security features.
In C++, the easiest way to do that is to use Secure Template Overloads. This will eliminate deprecation warnings, in many cases, by replacing calls to deprecated functions with calls to secure versions of those functions. For example, consider this deprecated call to strcpy :
Defining _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES as 1 eliminates the warning by changing the strcpy call to strcpy_s , which prevents buffer overruns. For more information, see Secure Template Overloads.
For those deprecated functions without secure template overloads, you should definitely consider manually updating your code to use the secure versions.
Another source of deprecation warnings, unrelated to security, is the POSIX functions. Replace POSIX function names with their standard equivalents (for example, change access to _access), or disable POSIX-related deprecation warnings by defining _CRT_NONSTDC_NO_WARNINGS . For more information, see Compatibility.
Additional Security Features
Some of the security features include:
Parameter Validation . Secure functions, and many of their unsecure counterparts, validate parameters. Validation may include:
- Checking for NULL values.
- Checking enumerated values for validity.
- Checking that integral values are in valid ranges.
A handler for invalid parameters is also accessible to the developer. When a function encounters an invalid parameter, instead of asserting and exiting the application, the CRT allows you to check these problems via _set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler.
Sized Buffers . You must pass the buffer size to any secure function that writes to a buffer. The secure versions validate that the buffer is large enough before writing to it. Which helps avoid dangerous buffer overrun errors that could allow malicious code to execute. These functions usually return an errno error code and invoke the invalid parameter handler if the size of the buffer is too small. Functions that read from input buffers, such as gets , have secure versions that require you to specify a maximum size.
Null termination . Some functions that left potentially non-terminated strings have secure versions, which ensure that strings are properly null-terminated.
Enhanced error reporting . The secure functions return error codes with more error information than was available with the pre-existing functions. The secure functions and many of the pre-existing functions now set errno and often return an errno code type as well, to provide better error reporting.
Filesystem security . Secure file I/O APIs support secure file access in the default case.
Windows security . Secure process APIs enforce security policies and allow ACLs to be specified.
Format string syntax checking . Invalid strings are detected, for example, using incorrect type field characters in printf format strings.
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 Answers 7
Mark all the desired projects in solution explorer.
- Press Alt-F7 or right click in solution explorer and select "Properties"
- Configurations: All Configurations
- Click on the Preprocessor Definitions line to invoke its editor
- Choose Edit
- Copy _CRT_SECURE_NO_WARNINGS into the Preprocessor Definitions white box on the top
This describes how to add it for one project which I think the OP already knows (although it's not 100% clear). The key question is how to add it so that it appears in all projects. Ideally, how can one add it to the %(PreprocessorDefinitions) macro so that it gets included everywhere?
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.
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.
- Open up the Property Manager (View->Property Manager)
- In the Property Manager Right click on your project and select "Add New Project Property Sheet"
- Give it a name and create it in a common directory. The property sheet will be added to all build targets.
- 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.
- Go into "Common Properties->C/C++->Preprocessor"
- Edit the setting "Preprocessor Definitions" and add _CRT_SECURE_NO_WARNINGS .
- Save and you're done.
Now any time you create a new project, add this property sheet like so.
- Open up the Property Manager (View->Property Manager)
- 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.
Многие старые функции 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 .
Комментарии
Отключить предупреждение
Чтобы устранить проблему 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 создается в двух местах: по одному для строки, для которой объявлена устаревшая функция, а другая — для строки, в которой используется функция.
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Answered by:
Question
Developing on Windows 10 Pro, Visual Studio 2017 Community.
My application that calls strncpy() and other functions cause warnings in Visual Studio. I can live with those warnings.
I've reinstalled Visual Studio this week and I'm seeing both warnings and errors generated from the same call to strncpy in the header I built to interface with the Firebird database.
This might hold a clue to the resolution of this problem.
A warning is generated by every project that has an include for this header file, except one.
That error is generated by the build of the Firebird utility's project. The property page for firebird_utilities, all configurations and all platforms, has Treat Warnings As Errors set to No(/WX-).
This is the source that generates many warnings and 1 error.
As you can see, _CRT_SECURE_NO_WARNINGS is defined before the function call.
Answers
_CRT_SECURE_NO_WARNINGS should be defined before inclusion of the CRT headers.
you should add _CRT_SECURE_NO_WARNINGS to the project settings, not inside your source code.
The _CRT_SECURE_NO_WARNINGS macro is used as input to another macro:
This is in vcruntime.h. Since this is a macro then this is parsed at the point that the header is included. This means that _CRT_SECURE_NO_WARNINGS needs to be defined before vcruntime.h gets included either directly or indirectly. I state indirectly here because vcruntime.h is included through a high percentage of the CRT and STL headers.
An example of vcruntime.h being pulled in indirectly which is relevant is string.h/cstring. If we start with cstring, this includes string.h, string.h includes vcruntime_string.h and this includes vcruntime.h.
This is a signature. Any samples given are not meant to have error checking or show best practices. They are meant to just illustrate a point. I may also give inefficient code or introduce some problems to discourage copy/paste coding. This is because the major point of my posts is to aid in the learning process.
Читайте также: