Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio
Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
6. Попробуем заново выполнить сборку проекта:
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou. ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М. В. Ломоносова
А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?
Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!
В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!
Почему именно мы?
Как с нами связаться?
Programforyou — доверяя нам писать программы, вы получаете качественное решение в короткие сроки по привлекательной цене!
Crt secure no warnings c как подключить
БлогNot. Visual C++: используем _CRT_SECURE_NO_WARNINGS для совместимости с классическими.
Visual C++: используем _CRT_SECURE_NO_WARNINGS для совместимости с классическими функциями
Часто жалуются на "неработающие" коды, особенно консольных приложений или CLR, особенно тех, что работали без каких-либо замечаний в версиях 2010-2013 и вдруг "не работают" в 2015, например, вот этот код.
Выдаются ошибки типа
Ошибка C4996 ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Правда, в последнем случае изменится и "классический" оператор открытия файла, скажем, с
Суть дела в том, что функции, возвращающие указатель, считаются небезопасными, отсюда и изменившийся шаблон метода открытия файла.
Есть путь ещё проще — напишите
Можно также попробовать "дорисовать" его не в заголовках, а в настройках проекта.
Управление предкомпилированными заголовками находится вот где: меню Проект — Свойства C/C++ — Препроцессор (Preprocessor) — Определения препроцессора (Preprocessor Definitions).
Проверено на пустом проекте C++ Visual Studio 2015, сработало.
13.10.2015, 11:48; рейтинг: 41576
Компилятор обнаружил устаревшее объявление. The compiler encountered a deprecated declaration. Это предупреждение всегда является намеренным сообщение от автора библиотеки или файле заголовка, что не следует использовать нерекомендуемый символ ясны не. This warning is always a deliberate message from the author of the library or included header file that you should not use the deprecated symbol without understanding the consequences. Фактический предупреждающее сообщение указывается модификатор устаревания или атрибут на сайте объявления. The actual warning message is specified by the deprecation modifier or attribute at the site of the declaration.
Ниже приведены некоторые распространенные C4996 сообщения, создаваемые библиотеки времени выполнения C и стандартной библиотеки, но не является исчерпывающим. These are some common C4996 messages generated by the C Runtime Library and the Standard Library, but not an exhaustive list. Перейдите по ссылкам, или ознакомьтесь со способами для устранения проблемы или отключить это предупреждение. Follow the links or read on for ways to fix the issue or to turn the warning off.
Причина Cause
Предупреждение C4996 возникает, когда компилятор обнаруживает функцию или переменную, помеченную как устаревшим с помощью __declspec(deprecated) модификатор, или при попытке получить доступ к функции, член класса или типа с C ++ 14 [ [устаревшим] ] атрибута. C4996 occurs when the compiler encounters a function or variable that is marked as deprecated by using a __declspec(deprecated) modifier, or when you attempt to access a function, class member or typedef that has the C++14 [[deprecated]] attribute. Можно использовать __declspec(deprecated) модификатор или [[deprecated]] атрибут самостоятельно в библиотеки и файлов заголовков, чтобы предупреждать клиентов о устаревшие функции, переменные, члены и определения типов. You can use the __declspec(deprecated) modifier or [[deprecated]] attribute yourself in your libraries or header files to warn your clients about deprecated functions, variables, members, or typedefs.
Примечания Remarks
Многие функции, функции-члены, функции шаблонов и глобальных переменных в библиотеках в Visual Studio, помечаются как устаревшим. Many functions, member functions, template functions, and global variables in the libraries in Visual Studio are marked as deprecated. Эти функции являются устаревшими, так как они могут иметь разные предпочтительные имена, могут небезопасными или иметь более безопасный вариант, либо могут быть устаревшими. These functions are deprecated because they may have a different preferred name, may be insecure or have a more secure variant, or may be obsolete. Многие сообщения об устаревании входить предложенная замена устаревшей функции или глобальной переменной. Many deprecation messages include a suggested replacement for the deprecated function or global variable.
Чтобы устранить эту проблему, мы обычно рекомендуем изменить код, чтобы вместо этого используйте предложенные безопаснее или добавлены следующие функции и глобальные переменные. To fix this issue, we usually recommend you change your code to use the suggested safer or updated functions and global variables instead. Если необходимо использовать существующие функции или переменные в целях переносимости, предупреждение можно отключить. If you need to use the existing functions or variables for portability reasons, the warning can be turned off.
Чтобы отключить это предупреждение без исправления проблемы To turn the warning off without fixing the issue
Можно отключить предупреждение глобально в сборках командной строки с помощью /wd4996 параметр командной строки. You can turn the warning off globally in command line builds by using the /wd4996 command line option.
Чтобы отключить предупреждения для всего проекта в Интегрированной среде разработки Visual Studio: To turn off the warning for an entire project in the Visual Studio IDE:
Можно также использовать макросы препроцессора для отключения определенных классов, определенных для предупреждения о нерекомендуемых функциях, которые используются в библиотеках. You can also use preprocessor macros to turn off certain specific classes of deprecation warnings used in the libraries. Ниже приведено описание этих макросов. These macros are described below.
Определение макроса препроцессора в Visual Studio: To define a preprocessor macro in Visual Studio:
Чтобы определить макрос только в определенных исходных файлах, добавьте строку, такие как #define EXAMPLE_MACRO_NAME перед любой строкой, которая включает файл заголовка. To define a macro only in specific source files, add a line such as #define EXAMPLE_MACRO_NAME before any line that includes a header file.
Определенные сообщения C4996 Specific C4996 messages
Ниже приведены некоторые распространенные источники ошибки и предупреждения C4996. Here are some of the common sources of C4996 warnings and errors.
Имена POSIX-функция POSIX function names
Имя POSIX для этого элемента устарело. Вместо этого используйте ISO C и C++ имя, соответствующее стандарту: новое_имя. 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 переименовала некоторые функции POSIX в CRT для обеспечения соответствия с C99 и правила C ++ 03 для имен глобальных функций, задаваемых в реализации. Microsoft has renamed some POSIX functions in the CRT to conform with C99 and C++03 rules for implementation-defined global function names. Только исходные имена POSIX являются устаревшими, не сами функции. Only the original POSIX names are deprecated, not the functions themselves. В большинстве случаев к имени функции POSIX добавляется символ подчеркивания в начале, чтобы создать имя, соответствующее стандартам. In most cases, a leading underscore was added to the POSIX function name to create a standard conformant 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 these warnings off. Функции POSIX по-прежнему доступны в библиотеке в разделе первоначальные имена. The POSIX functions are still available in the library under their original names.
Небезопасные функции библиотеки CRT Unsafe CRT Library functions
Эта функция или переменная может быть небезопасным. Рассмотрите возможность использования safe_version вместо этого. Чтобы отключить об устаревании, используйте _CRT_SECURE_нет_ПРЕДУПРЕЖДЕНИЯ. See online help for details. (Функция или переменная может быть небезопасной. Используйте strncpy_s. Дополнительные сведения см. в справке.) 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++ и глобальные переменные в пользу более безопасные версии. Microsoft has deprecated some CRT and C++ Standard Library functions and globals in favor of more secure versions. В большинстве случаев устаревшие функции позволяют unchecked чтения или записи в буферы, что может привести к серьезным уязвимостей. In most cases, the deprecated functions allow unchecked read or write access to buffers, which can lead to serious security issues. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию. The compiler issues a deprecation warning for these functions, and suggests the preferred function.
Чтобы устранить эту проблему, мы рекомендуем использовать функцию или переменную safe_version вместо этого. To fix this issue, we recommend you use the function or variable safe_version instead. Если вы убедились, что невозможно для перезаписи буфера или overread в коде и не может изменить код для переносимости причинам, можно отключить предупреждение. If you have verified that it’s not possible for a buffer overwrite or overread to occur in your code, and you cannot change the code for portability reasons, you can turn off the warning.
Чтобы отключить предупреждения об устаревании для этих функций в CRT, задайте _CRT_SECURE_нет_ПРЕДУПРЕЖДЕНИЯ. To turn off deprecation warnings for these functions in the CRT, define _CRT_SECURE_NO_WARNINGS. Чтобы отключить предупреждения об устаревших глобальных переменных, определите _CRT_SECURE_нет_ПРЕДУПРЕЖДЕНИЯ_GLOBALS. To turn off warnings about deprecated global variables, define _CRT_SECURE_NO_WARNINGS_GLOBALS. Дополнительные сведения об этих устаревших функциях и глобальных переменных см. в разделе функции безопасности в CRT и безопасные библиотеки: Стандартная библиотека C++. 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
Это предупреждение появляется в отладочных построениях, так как некоторые функции стандартной библиотеки C++ не проверяют правильность параметров. This warning appears in debug builds because certain C++ Standard Library template functions do not check parameters for correctness. В большинстве случаев это, поскольку не хватает информация доступна функция для проверки границ контейнера или итераторов может использоваться неправильно с функцией. In most cases, this is 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 function uses, because they may be a source of serious security holes in your program. Для получения дополнительной информации см. Checked Iterators. For more information, see Checked Iterators.
Например, это предупреждение появляется в режиме отладки, если передать указатель элемента для std::copy вместо обычного массива. 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.
Несколько алгоритмов стандартной библиотеки были обновлены для версии «dual диапазон» в C ++ 14. 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 have verified that your code cannot have a buffer overrun error in the Standard Library functions that trigger this warning, you may want to turn this warning off. Чтобы отключить предупреждения для этих функций, задайте _SCL_SECURE_нет_ПРЕДУПРЕЖДЕНИЯ. To turn off warnings for these functions, define _SCL_SECURE_NO_WARNINGS.
Проверяемые итераторы включены Checked iterators enabled
Код небезопасный MFC или ATL Unsafe MFC or ATL code
Предупреждение C4996 также может возникать при использовании функций библиотек MFC или ATL, устаревших по соображениям безопасности. C4996 can also 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.
Сведения о том, как отключить эти предупреждения, см. в разделе _AFX_SECURE_NO_WARNINGS. For information on how to suppress these warnings, see _AFX_SECURE_NO_WARNINGS.
Устаревшие функции CRT и переменные Obsolete CRT functions and variables
Эта функция или переменная было заменено более новые функциональные возможности библиотеки или операционной системы. Рассмотрите возможность использования new_item вместо этого. See online help for details. (Функция или переменная может быть небезопасной. Используйте strncpy_s. Дополнительные сведения см. в справке.) 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.
Чтобы отключить предупреждения об устаревании для этих элементов, задайте _CRT_OBSOLETE_нет_ПРЕДУПРЕЖДЕНИЯ. 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.
Ошибки маршалинга в коде CLR Marshalling errors in CLR code
Предупреждение C4996 также может возникать при использовании библиотеки маршалинга среды CLR. C4996 can also occur when you use the CLR marshaling library. В этом случае C4996 будет ошибкой, а не предупреждением. In this case C4996 is an error, not a warning. Эта ошибка возникает при использовании marshal_as для преобразования между двумя типами данных, требующих класс marshal_context. This 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 does not support a conversion. Дополнительные сведения о библиотеке маршалинга см. в статье Overview of Marshaling in C++. For more information about the marshaling library, see Overview of Marshaling in C++.
Пример Определяемая пользователем функция не рекомендуется 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. В этом случае C4996 создается строка, в котором объявлена устаревшей функции, а строки, в которой используется функция. In this example, C4996 is generated for the line on which the deprecated function is declared, and for the line on which the function is used.
Есть ли способ установить по умолчанию для всех проектов удаление предупреждений прекомпилятора о безопасности, которые появляются при использовании таких функций, как scanf (). Я обнаружил, что вы можете сделать это, добавив строку в опцию проекта или #define _CRT_SECURE_NO_WARNINGS в начале кода.
Я постоянно создаю новые проекты для решения программных конкурсов, и это действительно раздражает (и занимает драгоценное время), чтобы добавить:
В начале кода, или установить его в настройках прекомпилятора каждый раз, когда я начинаю новый проект.
Решение
Отметьте все нужные проекты в обозревателе решений.
Нажмите Alt-F7 или щелкните правой кнопкой мыши в обозревателе решений и выберите «Свойства»
Конфигурации: все конфигурации
Нажми на
Строка Preprocessor Definitions для вызова его редактора
Скопируйте «_CRT_SECURE_NO_WARNINGS» в белое поле «Определения препроцессора» вверху.
Другие решения
Возможно, это потому, что я все еще новичок в VS и определенно новичок в C, но единственное, что позволило мне собрать, — это добавить
Вверху моего файла это подавило ошибку C4996, которую я получал с помощью sprintf.
Немного раздражает, но идеально подходит для моего крошечного кода и, безусловно, самый простой.
Не автоматически, нет. Вы можете создать шаблон проекта как BlueWandered предложенный или же создайте пользовательский список свойств, который вы можете использовать для своих текущих и всех будущих проектов.
Теперь каждый раз, когда вы создаете новый проект, добавьте этот список свойств примерно так …
Преимущество в том, что вы получаете не только единое место для управления общими настройками, но и в любое время, когда вы изменяете настройки, они распространяются на ВСЕ проекты, которые его используют. Это удобно, если у вас много настроек, таких как _CRT_SECURE_NO_WARNINGS или библиотеки типа Boost, которые вы хотите использовать в своих проектах.
Все решения здесь не сработали на моем VS2013, однако я поставил #define _CRT_SECURE_NO_WARNINGS в stdafx. h как раз перед #pragma once и все предупреждения были подавлены. Примечание: я пишу код только для целей создания прототипов, чтобы поддержать мои исследования, поэтому, пожалуйста, убедитесь, что вы понимаете значение этого метода при написании своего кода.
Надеюсь это поможет
мои два цента за VS 2017:
Я могу подтвердить, что он работает в stdafx. h в обоих стилях:
Я могу подтвердить, что:
#define _CRT_SECURE_NO_WARNINGS
(без значения) НЕ РАБОТА.
https://programforyou. ru/poleznoe/izbavlyaemsya-ot-oshibki-This-function-or-variable-maybe-unsafe-v-Visual-Studio
https://web-shpargalka. ru/crt-secure-no-warnings-c-kak-podkljuchit. php