I have compile error in my simple MFC window application generated from wizard with several lines of code:
error C4996: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
I set Configuration Properties>>C/C++>>Preporocessor>>Preprocessor Definitions>> _CRT_NONSTDC_NO_WARNINGS
But this does’t helped. I have another very close project that generates only warning in this place and it has no _CRT_NONSTDC_NO_WARNINGS definition.
Only difference between projects is several different options in wizard.
Why _CRT_NONSTDC_NO_WARNINGS does not helps in first project and why second project compiles without problems without this definition?
![]()
Bo Persson
89.7k31 gold badges143 silver badges201 bronze badges
asked Mar 17, 2014 at 9:15
6
Add by
Configuration Properties>>C/C++>>Preporocessor>>Preprocessor
Definitions>> _CRT_SECURE_NO_WARNINGS

Sumurai8
20k10 gold badges69 silver badges99 bronze badges
answered Mar 17, 2014 at 9:37
BaluBalu
2,1371 gold badge17 silver badges23 bronze badges
3
Under «Project -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions» add _CRT_SECURE_NO_WARNINGS
answered Feb 15, 2015 at 10:59
nexusclarumnexusclarum
9611 gold badge6 silver badges3 bronze badges
0
If your are in Visual Studio 2012 or later this has an additional setting ‘SDL checks’ Under Property Pages -> C/C++ -> General
Additional Security Development Lifecycle (SDL) recommended checks; includes enabling additional secure code generation features and extra security-relevant warnings as errors.
It defaults to YES — For a reason, I.E you should use the secure version of the strncpy. If you change this to NO you will not get a error when using the insecure version.
SDL checks in vs2012 and later
answered Mar 20, 2015 at 16:05
kmcnameekmcnamee
4,9872 gold badges25 silver badges36 bronze badges
1
For a quick fix or test, I find it handy just adding #define _CRT_SECURE_NO_WARNINGS to the top of the file before all #include
#define _CRT_SECURE_NO_WARNINGS
#include ...
int main(){
//...
}
![]()
answered Apr 14, 2019 at 16:22
CarlosioCarlosio
3492 silver badges6 bronze badges
3
Adding _CRT_SECURE_NO_WARNINGS to Project -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions didn’t work for me, don’t know why.
The following hint works:
In stdafx.h file, please add
#define _CRT_SECURE_NO_DEPRECATE
before include other header files.
![]()
Niall
29.6k10 gold badges100 silver badges139 bronze badges
answered Jan 24, 2019 at 8:39
Visual Studio 2019 with CMake
Add the following to CMakeLists.txt:
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
answered Jan 17, 2021 at 5:36
![]()
rbentorbento
8,7103 gold badges59 silver badges58 bronze badges
1
I was getting the same error in Visual Studio 2017 and to fix it just added #define _CRT_SECURE_NO_WARNINGS after #include "pch.h"
#include "pch.h"
#define _CRT_SECURE_NO_WARNINGS
....
answered Jul 12, 2020 at 9:58
![]()
molecodermolecoder
4131 gold badge7 silver badges24 bronze badges
| title | description | ms.date | ms.topic | f1_keywords | helpviewer_keywords | ms.assetid | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Security Features in the CRT |
An overview of secure CRT functions in the Microsoft C runtime. |
09/29/2020 |
conceptual |
|
|
d9568b08-9514-49cd-b3dc-2454ded195a3 |
Many old CRT functions have newer, more secure versions. If a secure function exists, the older, less secure version is marked as deprecated. The new version has the _s («secure») suffix.
In this context, «deprecated» means that use of the function isn’t recommended. It doesn’t mean the function will be removed from the CRT.
The secure functions don’t prevent or correct security errors. Instead, they catch errors when they occur. They do extra checks for error conditions. If there’s an error, they invoke an error handler (see Parameter validation).
For example, the strcpy function can’t tell if the string it copies 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’s 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 eliminate the deprecation warnings is to use Secure template overloads. The overloads eliminate deprecation warnings in many cases. They replace calls to deprecated functions with calls to secure versions of the functions. For example, consider this deprecated call to strcpy:
char szBuf[10]; strcpy(szBuf, "test"); // warning: deprecated
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.
More 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
NULLvalues. - Checking enumerated values for validity.
- Checking that integral values are in valid ranges.
For more information, see Parameter validation.
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_handleror_set_thread_local_invalid_parameter_handler. - Checking for
-
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. The validation helps avoid dangerous buffer overrun errors that could allow malicious code to execute. These functions usually return an
errnoerror code and invoke the invalid parameter handler if the size of the buffer is too small. Functions that read from input buffers, such asgets, 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
errnoand often return anerrnocode 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, when you use incorrect type field characters in
printfformat strings.
See also
Parameter validation
Secure template overloads
C runtime (CRT) and C++ Standard Library (STL) .lib files
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.
Можете, как и рекомендует компилятор,
заменить старые названия функций на их безопасные версии, скажем,
strcpy на strcpy_s и
fopen на fopen_s.
Правда, в последнем случае
изменится и «классический» оператор открытия файла, скажем, с
FILE *out = fopen_s("data.txt", "wt");
на
FILE *out; fopen_s(&out,"data.txt", "wt");
Суть дела в том, что функции, возвращающие указатель, считаются небезопасными, отсюда и изменившийся шаблон метода открытия файла.
Есть путь ещё проще — напишите
#define _CRT_SECURE_NO_WARNINGS
в самом начале до всех #include.
Если используется предкомпиляция, то можно определить этот макрос в заголовочном файле stdafx.h.
Можно также попробовать «дорисовать» его не в заголовках, а в настройках проекта.
Управление предкомпилированными заголовками находится вот где: меню Проект — Свойства C/C++ — Препроцессор (Preprocessor) — Определения препроцессора (Preprocessor Definitions).
Проверено на пустом проекте C++ Visual Studio 2015, 2019, сработало.
Некоторым функциям директива «не поможет», например, stricmp всё равно придётся заменять но _stricmp, правда, без изменения списка аргументов.
Заметим, что по стандартам C++ функции
strcpy,strcatи другие не устарели, это собственная политика Microsoft.
13.10.2015, 11:48 [93579 просмотров]
К этой статье пока нет комментариев, Ваш будет первым
I have compile error in my simple MFC window application generated from wizard with several lines of code:
error C4996: ‘strncpy’: This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
I set Configuration Properties>>C/C++>>Preporocessor>>Preprocessor Definitions>> _CRT_NONSTDC_NO_WARNINGS
But this does’t helped. I have another very close project that generates only warning in this place and it has no _CRT_NONSTDC_NO_WARNINGS definition.
Only difference between projects is several different options in wizard.
Why _CRT_NONSTDC_NO_WARNINGS does not helps in first project and why second project compiles without problems without this definition?
SOLUTION 1 :
Add by
Configuration Properties>>C/C++>>Preporocessor>>Preprocessor Definitions>> _CRT_SECURE_NO_WARNINGS

SOLUTION 2 :
Under «Project -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions» add _CRT_SECURE_NO_WARNINGS
SOLUTION 3 :
If your are in Visual Studio 2012 or later this has an additional setting ‘SDL checks’ Under Property Pages -> C/C++ -> General
Additional Security Development Lifecycle (SDL) recommended checks; includes enabling additional secure code generation features and extra security-relevant warnings as errors.
It defaults to YES — For a reason, I.E you should use the secure version of the strncpy. If you change this to NO you will not get a error when using the insecure version.
SDL checks in vs2012 and later
SOLUTION 4 :
Adding _CRT_SECURE_NO_WARNINGS to Project -> Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions didn’t work for me, don’t know why.
The following hint works: In stdafx.h file, please add «#define_CRT_SECURE_NO_DEPRECATE» before include other header files.
SOLUTION 5 :
For a quick fix or test I find it handy just adding #define _CRT_SECURE_NO_WARNINGS to the top of the file before all #include
#define _CRT_SECURE_NO_WARNINGS
#include ...
int main(){
//...
}
Label : tag_c++ tag_visual-c++ tag_visual-studio-2012 tag_warnings
|
Frstr 2 / 2 / 0 Регистрация: 11.03.2010 Сообщений: 72 |
||||
|
1 |
||||
|
14.03.2010, 15:54. Показов 171361. Ответов 44 Метки нет (Все метки)
Код — работа с файлом. Выдает ошибку warning C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
__________________
0 |
|
Nick Alte
1672 / 1044 / 174 Регистрация: 27.09.2009 Сообщений: 1,945 |
||||
|
14.03.2010, 16:00 |
2 |
|||
|
Решение
пишешь в самом начале, до всех #include
13 |
|
2 / 2 / 0 Регистрация: 11.03.2010 Сообщений: 72 |
|
|
14.03.2010, 16:07 [ТС] |
3 |
|
написал. не получилось-
0 |
|
1672 / 1044 / 174 Регистрация: 27.09.2009 Сообщений: 1,945 |
|
|
14.03.2010, 16:55 |
4 |
|
Решение Ну если ты предкомпилированные заголовки используешь, тогда что ж делать… Не пиши в заголовках, попробуй дорисовать это волшебное в настройках проекта: C/C++ — Preprocessor — Preprocessor Definitions.
5 |
|
2 / 2 / 0 Регистрация: 11.03.2010 Сообщений: 72 |
|
|
14.03.2010, 17:08 [ТС] |
5 |
|
отключил предкомпилированные заголовки там в настройках и заработало. Спасибо!!
0 |
|
jon_illien 3 / 3 / 1 Регистрация: 14.08.2012 Сообщений: 78 |
||||
|
24.03.2013, 01:01 |
6 |
|||
|
пишешь в самом начале, до всех #include помогло когда написал именно в самом начале. спасибо
3 |
|
4 / 4 / 1 Регистрация: 15.12.2012 Сообщений: 39 |
|
|
01.05.2013, 21:51 |
7 |
|
Если используется предкомпилляция, то можно определить этот макрос в заголовочном файле stdafx.h Код #define _CRT_SECURE_NO_WARNINGS
1 |
|
5 / 5 / 1 Регистрация: 04.06.2013 Сообщений: 89 |
|
|
11.12.2013, 19:32 |
8 |
|
Кстати, warning — это не ошибка, а предупреждение. Получить работающую программу можно и с предупреждениями. Странно, у меня эта хрень (Consider using strcat_s instead.) идёт как ошибка со своим кодом.
warning C4603: _CRT_SECURE_NO_WARNINGS: макрос не определен… аналогично
попробуй дорисовать это волшебное в настройках проекта: C/C++ — Preprocessor — Preprocessor Definitions. 1>c:program files (x86)microsoft visual studio 11.0vcincludecrtdefs.h(44): fatal error C1189: #error : ERROR: Only Win32 target supported!
0 |
|
831 / 639 / 100 Регистрация: 20.08.2013 Сообщений: 2,524 |
|
|
13.12.2013, 17:33 |
9 |
|
Странно, у меня эта хрень (Consider using strcat_s instead.) идёт как ошибка со своим кодом. Из-за этого.
1 |
|
0 / 0 / 0 Регистрация: 25.07.2016 Сообщений: 4 |
|
|
28.10.2016, 23:18 |
11 |
|
#define _CRT_SECURE_NO_WARNINGS что это значит?
0 |
|
0 / 0 / 0 Регистрация: 22.11.2016 Сообщений: 6 |
|
|
24.11.2017, 00:20 |
13 |
|
Помогло. Спасибо!
0 |
|
45 / 42 / 5 Регистрация: 10.01.2017 Сообщений: 1,517 |
|
|
28.01.2019, 15:15 |
14 |
|
Люди добрые помогите: Пробовал: -#define _CRT_SECURE_NO_WARNINGS В настройках проекта писал: Даже пробовал: И все равно выводится этот warnings. (((
0 |
|
998 / 364 / 81 Регистрация: 17.05.2015 Сообщений: 1,193 |
|
|
28.01.2019, 15:31 |
15 |
|
#define _CRT_SECURE_NO_WARNINGS что это значит? Идентификатор препроцессора. Предназначен для служебного использования внутри стандартной библиотеки с++ от Visual Studio. И хотя, формально, использование данного дефайна не разрешается,
0 |
|
3528 / 2183 / 400 Регистрация: 09.09.2017 Сообщений: 8,988 |
|
|
28.01.2019, 18:02 |
16 |
|
Если бы msvs не ругался на стандартные функции, никто бы его не отключал.
0 |
|
eva2326 998 / 364 / 81 Регистрация: 17.05.2015 Сообщений: 1,193 |
||||
|
28.01.2019, 18:34 |
17 |
|||
|
1.
2. 3. А вот необходимости делать плохо, когда можно сделать хорошо — не существует.
0 |
|
3433 / 2812 / 1249 Регистрация: 29.01.2016 Сообщений: 9,426 |
|
|
28.01.2019, 18:52 |
18 |
|
Пробовал: Код покажи, как пробовал. Добавлено через 1 минуту
И все равно выводится этот warnings. ((( Какой конкретно?
0 |
|
Optimus11 45 / 42 / 5 Регистрация: 10.01.2017 Сообщений: 1,517 |
||||
|
28.01.2019, 19:24 |
19 |
|||
|
Да простейший код уже пробовал:
И соответственно сообщение от VS: Ошибка C4996 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
0 |
|
nd2 3433 / 2812 / 1249 Регистрация: 29.01.2016 Сообщений: 9,426 |
||||
|
28.01.2019, 19:28 |
20 |
|||
|
Да простейший код уже пробовал: Не вижу, где тут ты пробовал отключать через это:
0 |
- Remove From My Forums
-
Question
-
#include<stdio.h>
#include<conio.h>
#define _CRT_SECURE_NO_WARNINGS
void main(){
int x,y,temp;
printf(«Enter two numbers :»);
scanf(«%d,%d»,&x,&y);
printf(«nValue before swapping x=%d ,y=%d»,x,y);
temp=x;
x=y;
y=temp;
printf(«nValue after swapping x=%d ,y=%d»,x,y);
}I have written above pieace of code to simply swap two numbers.
But is is asking me to use scanf_s instead scanf.Y is it so…?
Please reply me asap
-
Moved by
Saturday, September 14, 2013 6:49 AM
Visual C++ specific
-
Moved by
Answers
-
Hi BijalPatel,
In stdafx.h file, please add «#define_CRT_SECURE_NO_DEPRECATE» before include other header files.
Also, you can add «_CRT_SECURE_NO_DEPRECATE» in Preprocessor Definitions.
Right-click your project->Properties->Configuration Properties->Preprocessor->Preprocessor Definitions.
Sunny Cao
<THE CONTENT IS PROVIDED «AS IS» WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
Thanks
MSDN Community SupportPlease remember to «Mark as Answer» the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.
-
Marked as answer by
Anna Cc
Monday, September 23, 2013 1:58 AM
-
Marked as answer by
2 Августа 2017
Время чтения: 5 минут

Компилятор в Visual Studio сильно отличается от привычных большинству программистов GCC или CLANG, из-за чего при написании кода на C или C++ очень часто возникают неожиданные проблемы в виде ошибки использования стандартных функций, например, scanf, fopen, sscanf и тому подобным. Студия предлагает заменять функции на безопасные (повезёт, если нужно просто добавить _s к функции с ошибкой, но нередко в этих функциях идёт иной набор аргументов, нежели в обычной программе). Если вы не готовы с этим мириться, то этот пост для вас!
Давайте для начала создадим обычный консольный проект в Visual Studio и напишем простенькую программу, которая запрашивает ввод двух чисел, вводит их и затем выводит на экран.
#include "stdafx.h"
#include <stdio.h>
int main() {
int a, b;
printf("Enter a: ");
scanf("%d", &a);
printf("Enter b: ");
scanf("%d", &b);
printf("a: %d, b: %dn", a, b);
return 0;
}
Попробовав выполнить сборку проекта, обнаружим те самые ошибки.
Чтобы Visual Studio не тратила ваши нервы, сделаем следующее:
1. Выберем пункт «Проект» в верхнем меню
2. В открывшемся списке щёлкнем по «Свойства название_проекта»
Программа, вводящая два числа и выводящая их
Ошибка компиляции из-за небезопасности функций
Проект — Свойства {навание проекта}
3. В появившемся окне выберем Свойства конфигурации, C/C++, Препроцессор
4. В строке Определения препроцессора допишем в самый конец строку ;_CRT_SECURE_NO_WARNINGS
5. Нажмём ОК
Свойства конфигурации
Определения препроцессора
Нажимаем OK
6. Попробуем заново выполнить сборку проекта:
Успешная сборка проекта
Ошибки исчезли, сборка прошла успешно и программа прекрасно работает! Теперь можно писать код как обычно, не переживая о необычном поведении Visual Studio!
Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов
Языки программирования: Python, C, C++, Pascal, C#, Javascript
Выпускник МГУ им. М.В. Ломоносова
Использование библиотеки OpenSSL в проектах на C++

В своем первом топике я постараюсь подробно объяснить как начать использовать библиотеку OpenSSL. Сразу хочу отметить, что статья ориентирована на новичков, а так как я сам один из них, исходный код выполнен без проверок и не претендует на звание лучшего. Все действия выполнялись под Windows со средой разработки Visual Studio 2013.
Шаг 1. Установка необходимых компонентов и компиляция библиотеки
Для того, чтобы подружить библиотеку OpenSSL с Visual Studio нам потребуется:
- Архив с исходниками для компиляции библиотеки версии 1.0.1 (Скачать с оф. сайта)
- Perl для конфигурирования библиотеки (Скачать с оф. сайта)
- Среда разработки Visual Studio, а именно ее утилита «Командная строка разработчика»
Обратите внимание, что после выполнения второй команды последней строчкой в консоле должно быть Configured for VC-WIN32. Конфигурирование завершено, теперь приступим к компиляции. Находим в пуске в каталоге Visual Studio «Командная строка разработчика», запускаем от имени администратора и вводим команды:
На этом компиляция закончена. В папке C:Tempopensslbin появились две библиотеки ssleay32.dll и libeay32.dll, а в папке C:Tempopenssllib появились ssleay32.lib и libeay32.lib.
Шаг 2. Подключение библиотек и исправление ошибок в среде разработки
Для использования функций библиотеки нам потребуется подключить к проекту заголовочные файлы, но сначала их надо поместить в папку, где установлена Visual Studio. Для этого переходим в каталог ..Visual StudioVCinclude и копируем туда папку C:Tempopensslincludeopenssl.
Теперь можно смело подключать заголовочные файлы (на примере rsa):
Также необходимо добавить в проект файлы с расширением .lib, которые мы получили ранее. Для этого откроем Обозреватель решений в Visual Studio, в дереве нашего проекта найдем папку Файлы ресурсов, щелкнем по ней правой клавишей -> Добавить -> Существующий элемент и выберем наши .lib файлы, находящиеся в C:Tempopenssllib.

Вполне возможно, что при попытке собрать проект в окне вывода будут появляться ошибки такого рода:
Это лечится путем разрешения загрузки символов с серверов Microsoft. Переходим во вкладку Сервис -> Параметры, слева в дереве выбираем Отладка -> Символы, ставим галку напротив «Серверы символов Microsoft» и нажимаем ОК. Теперь при следующей компиляции проекта недостающие файлы загрузятся автоматически.

Также рекомендую переставить конфигурацию сборки программы в Release, только так мне удалось избавиться от некоторых ошибок.
Шаг 3. Описание некоторых функций библиотеки и пример кода
Все необходимые компоненты, включая скомпилированный пример можно скачать с Яндекс.Диска.
Отключение предупреждений, генерируемых с помощью CRT SECURE NO DEPRECATE
каков наилучший способ отключить предупреждения, генерируемые через _CRT_SECURE_NO_DEPRECATE что позволяет их легко восстановить и будет работать в версиях Visual Studio?
10 ответов
Если вы не хотите загрязнять исходный код (после того, как все это предупреждение представлено только с компилятором Microsoft), добавьте _CRT_SECURE_NO_WARNINGS символ настроек вашего проекта через «проект»->»свойства»->»свойства конфигурации»->»C/C++»->»препроцессор» — >»определения препроцессора».
Также вы можете определить его непосредственно перед включением файла заголовка, который генерирует это предупреждение. Вы должны добавить что-то вроде этого
и просто небольшое замечание, убедитесь, что вы понимаете что означает это предупреждение, и, возможно, если вы не собираетесь использовать другие компиляторы, чем MSVC, рассмотрите возможность использования более безопасной версии функций, т. е. strcpy_s вместо strcpy.
вы можете временно отключить предупреждения в местах, где они появляются, используя
таким образом, вы не отключаете все предупреждения, которые могут быть вредными время от времени.
Я работаю над проектом с несколькими платформами, поэтому я не могу использовать функцию _s, и я не хочу загрязнять свой код кодом visual studio.
мое решение-отключить предупреждение 4996 в проекте visual studio. перейдите в проект — > свойства — > свойства конфигурации — > C / C++ — > дополнительно — > отключить конкретное предупреждение добавьте значение 4996.
если вы также используете библиотеку mfc и/или atl (не мой случай), определите перед включением mfc _AFX_SECURE_NO_DEPRECATE и перед включением atl _ATL_SECURE_NO_DEPRECATE.
я использую это решение в visual studio 2003 и 2005.
p.s. если вы используете только visual studio, перегрузки безопасного шаблона могут быть хорошим решением.
вы также можете использовать Безопасные Перегрузки Шаблонов, Они помогут вам заменить незащищенные вызовы безопасными в любом месте, где можно легко вывести размер буфера (статические массивы).
добавьте следующую строку:
затем исправьте оставшиеся предупреждения вручную, используя функции _s.
сочетание @[macbirdie] и @[Adrian Borchardt]ответ. Что оказывается очень полезным в производственной среде (не испортить ранее существовавшее предупреждение, особенно во время кросс-платформенной компиляции)
для предупреждения по случаю предупреждения разумно восстановить его по умолчанию в какой-то момент, так как вы делаете это в каждом конкретном случае.
лучший способ сделать это-просто проверить и оценить. Я обычно делаю что-то вроде этого:
все, что действительно требуется следующее:
еще не подвел меня; Надеюсь, это поможет
вы можете отключить проверку безопасности. перейти к
проект — > свойства — > свойства конфигурации — > C / C++ — > генерация кода — > проверка безопасности
и выберите Отключить проверку безопасности (/GS-)
вы можете определить символ _CRT_SECURE_NO_WARNINGS, чтобы подавить их и отменить его, чтобы восстановить их обратно.
еще один поздний ответ. Вот как Microsoft использует его в своих wchar.h . Обратите внимание, что они также отключают Предупреждение C6386:
Security Features in the CRT
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.
Есть ли способ установить по умолчанию для всех проектов удаление предупреждений прекомпилятора о безопасности, которые появляются при использовании таких функций, как scanf (). Я обнаружил, что вы можете сделать это, добавив строку в опцию проекта или #define _CRT_SECURE_NO_WARNINGS в начале кода.
Я постоянно создаю новые проекты для решения программных конкурсов, и это действительно раздражает (и занимает драгоценное время), чтобы добавить:
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
В начале кода, или установить его в настройках прекомпилятора каждый раз, когда я начинаю новый проект.
152
Решение
Отметьте все нужные проекты в обозревателе решений.
Нажмите Alt-F7 или щелкните правой кнопкой мыши в обозревателе решений и выберите «Свойства»
Конфигурации: все конфигурации
Нажми на
Строка Preprocessor Definitions для вызова его редактора
выберите
Редактировать…
Скопируйте «_CRT_SECURE_NO_WARNINGS» в белое поле «Определения препроцессора» вверху.

238
Другие решения
Возможно, это потому, что я все еще новичок в VS и определенно новичок в C, но единственное, что позволило мне собрать, — это добавить
#pragma warning(disable:4996)
Вверху моего файла это подавило ошибку C4996, которую я получал с помощью sprintf.
Немного раздражает, но идеально подходит для моего крошечного кода и, безусловно, самый простой.
Я читал об этом здесь: https://msdn.microsoft.com/en-us/library/2c8f766e.aspx
67
Не автоматически, нет. Вы можете создать шаблон проекта как BlueWandered предложенный или же создайте пользовательский список свойств, который вы можете использовать для своих текущих и всех будущих проектов.
- Откройте Менеджер свойств (View-> Property Manager)
- В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить новый список свойств проекта».
- Дайте ему имя и создайте его в общем каталоге. Лист свойств будет добавлен ко всем целям сборки.
- Щелкните правой кнопкой мыши новый лист свойств и выберите «Свойства». Это откроет свойства и позволит вам изменить настройки так же, как если бы вы редактировали их для проекта.
- Зайдите в «Общие свойства-> C / C ++ -> Препроцессор»
- Отредактируйте настройку «Определения препроцессора» и добавьте
_CRT_SECURE_NO_WARNINGS, - Сохранить и все готово.
Теперь каждый раз, когда вы создаете новый проект, добавьте этот список свойств примерно так …
- Откройте Менеджер свойств (View-> Property Manager)
- В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить существующий список свойств проекта».
Преимущество в том, что вы получаете не только единое место для управления общими настройками, но и в любое время, когда вы изменяете настройки, они распространяются на ВСЕ проекты, которые его используют. Это удобно, если у вас много настроек, таких как _CRT_SECURE_NO_WARNINGS или библиотеки типа Boost, которые вы хотите использовать в своих проектах.
22
Все решения здесь не сработали на моем VS2013, однако я поставил #define _CRT_SECURE_NO_WARNINGS в stdafx.h как раз перед #pragma once и все предупреждения были подавлены. Примечание: я пишу код только для целей создания прототипов, чтобы поддержать мои исследования, поэтому, пожалуйста, убедитесь, что вы понимаете значение этого метода при написании своего кода.
Надеюсь это поможет
20
мои два цента за VS 2017:
Я могу подтвердить, что он работает в stdafx.h в обоих стилях:
а)
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1
б)
#define _CRT_SECURE_NO_WARNINGS 1
#define _WINSOCK_DEPRECATED_NO_WARNINGS 1
#pragma once
(Я добавил другое определение для сетевых вызовов MSDN ..)
Конечно я предпочитаю а).
Я могу подтвердить, что:
#define _CRT_SECURE_NO_WARNINGS
(без значения) НЕ РАБОТА.
PS реальная цель состоит в том, чтобы поместить эти определения ДО объявления функций, то есть до * .h
9
Если ваш проект не использует stdafx.h, вы можете поместить следующие строки в качестве первых строк в вашем файле .cpp, и предупреждение компилятора должно исчезнуть — по крайней мере, для меня это было в Visual Studio C ++ 2008.
#ifdef _CRT_SECURE_NO_WARNINGS
#undef _CRT_SECURE_NO_WARNINGS
#endif
#define _CRT_SECURE_NO_WARNINGS 1
Вполне нормально иметь комментарий и пустые строки перед ними.
0
Сообщение было отмечено как решение
