Меню

Crt secure no warnings ошибка

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's user avatar

Bo Persson

89.7k31 gold badges143 silver badges201 bronze badges

asked Mar 17, 2014 at 9:15

vico's user avatar

6

Add by

Configuration Properties>>C/C++>>Preporocessor>>Preprocessor
Definitions>> _CRT_SECURE_NO_WARNINGS

screenshot of the relevant config interface

Sumurai8's user avatar

Sumurai8

20k10 gold badges69 silver badges99 bronze badges

answered Mar 17, 2014 at 9:37

Balu's user avatar

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

nexusclarum's user avatar

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

kmcnamee's user avatar

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(){
    //...
}

Ru Chern Chong's user avatar

answered Apr 14, 2019 at 16:22

Carlosio's user avatar

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's user avatar

Niall

29.6k10 gold badges100 silver badges139 bronze badges

answered Jan 24, 2019 at 8:39

user2703790's user avatar

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

rbento's user avatar

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

molecoder's user avatar

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

_CRT_SECURE_NO_DEPRECATE

_CRT_NONSTDC_NO_WARNINGS

_CRT_SECURE_NO_WARNINGS

security deprecation warnings [C++]

CRT_NONSTDC_NO_DEPRECATE

buffers [C++], buffer overruns

deprecation warnings (security-related), disabling

_CRT_NONSTDC_NO_WARNINGS

security [CRT]

_CRT_SECURE_NO_WARNINGS

_CRT_NONSTDC_NO_DEPRECATE

_CRT_SECURE_NO_DEPRECATE

security-enhanced CRT

CRT_SECURE_NO_WARNINGS

CRT_SECURE_NO_DEPRECATE

deprecation warnings (security-related)

buffer overruns

CRT_NONSTDC_NO_WARNINGS

CRT, security enhancements

parameters [C++], validation

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 NULL values.
    • 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_handler or _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. The validation 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, when you use incorrect type field characters in printf format 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

screenshot of the relevant config interface

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.
Прочел что как то надо отключить эту ошибку. Подскажите пожалуйста как это сделать в Visual Studio 2008

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int f9()
 
{
FILE *file;
char* file_name = "file.txt";
char load_string[50] = "none";
 
file = fopen( file_name, "w" ); 
 
fputs( "string", file );
 
fclose( file );
 
file = fopen( file_name, "r" );
if( file != 0 )
{
fgets( load_string, 50 , file ); 
cout << "load_string = " << load_string << endl;
}
else
{
cout << "File not found !!!" << endl;
}
fclose(file);
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Nick Alte

Эксперт С++

1672 / 1044 / 174

Регистрация: 27.09.2009

Сообщений: 1,945

14.03.2010, 16:00

2

Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
#define _CRT_SECURE_NO_WARNINGS

пишешь в самом начале, до всех #include



13



2 / 2 / 0

Регистрация: 11.03.2010

Сообщений: 72

14.03.2010, 16:07

 [ТС]

3

написал. не получилось-
warning C4603: _CRT_SECURE_NO_WARNINGS: макрос не определен или определение изменилось после использования предкомпилированного заголовка
1> Добавление макроопределения в предкомпилированный заголовок вместо определения его здесь



0



Эксперт С++

1672 / 1044 / 174

Регистрация: 27.09.2009

Сообщений: 1,945

14.03.2010, 16:55

4

Лучший ответ Сообщение было отмечено как решение

Решение

Ну если ты предкомпилированные заголовки используешь, тогда что ж делать… Не пиши в заголовках, попробуй дорисовать это волшебное в настройках проекта: C/C++ — Preprocessor — Preprocessor Definitions.
Кстати, warning — это не ошибка, а предупреждение. Получить работающую программу можно и с предупреждениями.



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

Цитата
Сообщение от Nick Alte
Посмотреть сообщение

C++
1
#define _CRT_SECURE_NO_WARNINGS

пишешь в самом начале, до всех #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

Цитата
Сообщение от Nick Alte
Посмотреть сообщение

Кстати, warning — это не ошибка, а предупреждение. Получить работающую программу можно и с предупреждениями.

Странно, у меня эта хрень (Consider using strcat_s instead.) идёт как ошибка со своим кодом.

Цитата
Сообщение от Frstr
Посмотреть сообщение

warning C4603: _CRT_SECURE_NO_WARNINGS: макрос не определен…

аналогично

Цитата
Сообщение от Nick Alte
Посмотреть сообщение

попробуй дорисовать это волшебное в настройках проекта: 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

Цитата
Сообщение от Oceloto
Посмотреть сообщение

Странно, у меня эта хрень (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
#pragma warning(suppress : 4996)

В настройках проекта писал:
-_CRT_SECURE_NO_WARNINGS
-_CRT_SECURE_NO_WARNINGS_GLOBALS
-Проверки SDL: Нет (/sdl-)

Даже пробовал:
Уровень предупреждений: Отключить все предупреждения (/W0)

И все равно выводится этот warnings. (((



0



998 / 364 / 81

Регистрация: 17.05.2015

Сообщений: 1,193

28.01.2019, 15:31

15

Цитата
Сообщение от Adal
Посмотреть сообщение

#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.
Хороший код не агрит компиляторы.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <algorithm>
#include <iterator>
 
int main() {
  int* a = new int[5]{ 1, 2, 3, 4, 5 };
  int* b = new int[5];
  std::copy(a, a + 5, stdext::make_checked_array_iterator(b, 5));
  std::copy(a, a + 5, stdext::make_unchecked_array_iterator(b));
  delete[] a;
  delete[] b;
}

2.
Там где процветает POSIX, и не процветает стандарт языка с++
(безопасные версии с суффиксом _s завезли в стандарт ещё в с++11)
всегда можно использовать небезопасные варианты безопасным образом (пример см. выше)

3.
На крайний случай можно просто пропасти гнутый компилятор препроцессором,
и подсунуть ему небезопасный вариант.

А вот необходимости делать плохо, когда можно сделать хорошо — не существует.



0



3433 / 2812 / 1249

Регистрация: 29.01.2016

Сообщений: 9,426

28.01.2019, 18:52

18

Цитата
Сообщение от Optimus11
Посмотреть сообщение

Пробовал:

Код покажи, как пробовал.

Добавлено через 1 минуту

Цитата
Сообщение от Optimus11
Посмотреть сообщение

И все равно выводится этот warnings. (((

Какой конкретно?



0



Optimus11

45 / 42 / 5

Регистрация: 10.01.2017

Сообщений: 1,517

28.01.2019, 19:24

19

Да простейший код уже пробовал:

C++
1
2
3
4
5
6
7
8
9
10
#include "pch.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
int main()
{
    FILE *filek; 
 
    filek = fopen("C:/C_exp/Text_doc/Textoviy.txt", "r");
}

И соответственно сообщение от 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

Цитата
Сообщение от Optimus11
Посмотреть сообщение

Да простейший код уже пробовал:

Не вижу, где тут ты пробовал отключать через это:

Цитата
Сообщение от Optimus11
Посмотреть сообщение

C++
1
2
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(suppress : 4996)



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

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 Support

    Please 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

2 Августа 2017

Время чтения: 5 минут

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

Компилятор в 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

Нажимаем OK

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

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

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

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

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

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Языки программирования: Python, C, C++, Pascal, C#, Javascript

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

Использование библиотеки OpenSSL в проектах на C++

image

В своем первом топике я постараюсь подробно объяснить как начать использовать библиотеку 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.

image

Вполне возможно, что при попытке собрать проект в окне вывода будут появляться ошибки такого рода:

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

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

  1. Откройте Менеджер свойств (View-> Property Manager)
  2. В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить новый список свойств проекта».
  3. Дайте ему имя и создайте его в общем каталоге. Лист свойств будет добавлен ко всем целям сборки.
  4. Щелкните правой кнопкой мыши новый лист свойств и выберите «Свойства». Это откроет свойства и позволит вам изменить настройки так же, как если бы вы редактировали их для проекта.
  5. Зайдите в «Общие свойства-> C / C ++ -> Препроцессор»
  6. Отредактируйте настройку «Определения препроцессора» и добавьте _CRT_SECURE_NO_WARNINGS,
  7. Сохранить и все готово.

Теперь каждый раз, когда вы создаете новый проект, добавьте этот список свойств примерно так …

  1. Откройте Менеджер свойств (View-> Property Manager)
  2. В диспетчере свойств щелкните правой кнопкой мыши свой проект и выберите «Добавить существующий список свойств проекта».

Преимущество в том, что вы получаете не только единое место для управления общими настройками, но и в любое время, когда вы изменяете настройки, они распространяются на ВСЕ проекты, которые его используют. Это удобно, если у вас много настроек, таких как _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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Crow плеер ошибка загрузки что делать
  • Crow player ошибка загрузки