Remkomplekty.ru

IT Новости из мира ПК
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

C4996 c ошибка

ошибка C4996: «ctime»: эта функция или переменная может быть небезопасной

У меня большой проект по статическому анализу исходного кода, и все успешно компилируется, кроме одного. Я предоставил сообщение об ошибке в заголовке. Меня смущает то, что выдает сообщение об ошибке «небезопасно». Я думал, что это должно быть просто предупреждение, а не ошибка. Кстати, я использую Visual Studio 2012. Вот часть кода, где я получаю сообщение об ошибке, в ctime. Если кто-то может помочь мне преодолеть эту ошибку, я был бы рад.

Решение

Если вы посмотрите на описание CTime вы заметите:

Эта функция возвращает указатель на статические данные и не является потокобезопасным. Кроме того, он изменяет статический тм объект которым можно поделиться с gmtime и localtime. POSIX помечает эту функцию как устаревшую и рекомендует вместо нее strftime.

поведение может быть неопределенным для значений time_t, результатом которых является строка длиной более 25 символов (например, год 10000)

… это много вещей для беспокойства.

С другой стороны, если вы посмотрите на STRFTIME :

size_t strftime (char * str, size_t count, const char * format, tm * time);

Возвращаемое значение

количество байтов, записанных в массив символов, на которые указывает str, не включая завершающий ‘ 0’ в случае успеха. Если число было достигнуто до того, как вся строка может быть сохранена, возвращается 0 и содержимое не определено.

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

Это C-way, а C ++ вводит в котором конкретная функция std::put_time также может использоваться для вывода времени в поток:

что даже лучше, так как вам больше не нужно беспокоиться о возможном переполнении буфера.

Другие решения

Если вы уверены, что в вашем коде нет проблем с безопасностью, вы можете отключить #pragma warning(disable : 4996) ,

Да, это должно быть просто предупреждение, а не ошибка.
Чтобы получить простое предупреждение вместо ошибки, отключите проверку SDL в проекте VS (в Свойствах конфигурации -> C / C ++ -> вкладка Общие).

std::ctime не является потокобезопасным по двум причинам:

  • Это может изменить глобальный объект типа std::tm это разделяется несколькими функциями.
  • Это изменяет глобальный char массив и возвращает указатель на этот массив.

Существует вероятность столкновения, если у вас есть другие потоки, которые вызывают std::gmtime , std::localtime , или же std::ctime ,

Лучше всего преобразовать этот вызов в std::ctime на звонок в std::strftime , Это согласуется с POSIX, который считает ctime устареть и рекомендует использовать strftime вместо него.

против 2017 года:

но вы все равно получите:

….cpp (31): предупреждение C4996: «местное время»: эта функция или переменная может быть небезопасной. Попробуйте вместо этого использовать localtime_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. Смотрите справку для деталей.

Для предотвращения вы можете использовать:

обычный C взят частично из MSDN … по-старому ..

Избавляемся от ошибки «This function or variable may be unsafe» в Visual Studio

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

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

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

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

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

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

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

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

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

Читать еще:  Архитектурная концепция это

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

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

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

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

Студент МГУ им. М.В. Ломоносова

А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?

Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!

В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!

Почему именно мы?

  • Более 1800 выполненных заказов;
  • Более 170 отзывов;
  • Качественное решение
  • Короткие сроки и привлекательные цены
  • Различные акции и скидки

Как с нами связаться?

  • группа Вконтакте: vk.com/programforyou
  • наша почта: order@programforyou.ru

Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!

C++ ‘strcpy’ выдает предупреждение (C4996)

Я получаю это предупреждение, но все функции работают правильно .

что же это на самом деле означает?

9 Ответов

Эта функция (strcpy) считается небезопасной из-за отсутствия проверки границ и может привести к переполнению буфера. (На самом деле strcpy печально известен своими эксплойтами переполнения, и все программисты избегают it-or, по крайней мере, должны избегать его). Совет состоит в том, чтобы использовать безопасную функцию, которая учитывает размер целевого буфера, чтобы избежать переполнения. Вы также можете использовать strncpy (BUT с осторожностью!). Нет никаких проблем с вашим кодом, т. е. функции будут работать, как вы говорите, но попробуйте дать в качестве входных данных буфер, который больше, чем буфер назначения. Функция будет переполнять буфер назначения. Проверить это текст ссылки

Хотя strcpy является обычной Строковой функцией, она имеет историю возникновения многих ошибок и дыр в безопасности программного обеспечения (из-за простоты переполнения буфера).

Microsoft, стремясь продвигать более безопасное кодирование в C и C++, предоставила набор функций замены для опасных строковых методов. Как правило, они имеют исходное имя, добавленное с _s. следовательно, Microsoft secure версия strcpy является strcpy_s, как рекомендуется в предупреждении. Обратите внимание, что это специфическая функция Microsoft, она не является повсеместной.

У тебя есть несколько вариантов.

  1. DEFINE _CRT_SECURE_NO_WARNINGS, если вы не хотите заботиться об этом, оставляя возможность проблем безопасности в вашем программном обеспечении.
  2. Замените свои строковые функции безопасными, в результате чего ваше программное обеспечение станет менее портативным
  3. Оберните функции secure string и используйте обертки везде, обеспечивая повышенную безопасность на платформах Windows и возвращаясь к традиционным версиям на других платформах. Оберточные функции могут быть через MACRO или скомпилированные функции.

Я обычно делаю #3.

Поскольку вы программируете C++, правильным решением будет запретить строки C-style char* из вашего кода, где это возможно, и заменить их на std::string (или другой подходящий тип строки).

Не используйте такие функции, как strcpy , strcpy_s или strncpy . Используйте конструктор копирования или оператор присваивания класса string . Или если вам действительно нужно скопировать буферы, используйте std::copy .

Поскольку VC++ 8 strcpy() и огромный набор других функций считаются небезопасными , поскольку они не имеют проверки границ и могут привести к переполнению буфера при неправильном использовании.

У вас есть два варианта:

  • если вы не уверены — делайте то, что говорит VC++, и используйте функции «safe». Они вызовут обработчик ошибок, который завершит вашу программу, если что-то пойдет не так.
  • если вы знаете, что делаете — вы знаете, что никакого переполнения никогда не произойдет, и все пограничные случаи обрабатываются вашим кодом — определите _CRT_SECURE_NO_WARNINGS до включения CRT заголовков, И это заставит предупреждение исчезнуть.

Это предупреждение в основном информирует Вас о том, что strcpy является устаревшим, потому что копирование строки до может легко привести к неприятным проблемам (переполнение буфера). Причина, по которой strcpy все еще существует и работает, заключается в том, что он является частью наследия стандартной библиотеки, но вы действительно должны рассмотреть возможность использования функций str*_s или strn* (которые не полагаются исключительно на поиск завершающего ).

Читать еще:  Error c2143 синтаксическая ошибка отсутствие перед

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

На самом деле есть способ избежать этого предупреждения, по-прежнему использовать strcpy и быть в безопасности:

Вы можете включить безопасную перегрузку шаблона . Они будут (если это возможно) выводить длину используемых буферов, захватывая их с шаблонными перегрузками. Для меня загадка, почему это не включено по умолчанию в Visual C++.

используйте приведенный выше код в первой строке вашего кода.

Если вы рассмотрели плюсы и минусы использования метода пуриста C++ против того, чтобы не беспокоиться, потому что вы ‘know’ ваши строки будут завершены нулем, то вы также можете отключить предупреждение в msvc, такого рода вещи:

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

если коды пишутся самостоятельно,то вам лучше поменять такие strcpy на strcpy_s и т.д. если модули импортируются из надежных источников, вы можете проигнорировать предупреждение.

игнорировать метод 1: project globle область действия: add _CRT_SECURE_NO_WARNINGS
игнорировать Метод 2: игнорировать конкретный модуль: если только один или два из них, то вы можете просто запретить предупреждение для этих модулей, когда включаете их:

Похожие вопросы:

Поэтому, когда я использую функцию IsWin2000(), чтобы выяснить, работает ли компьютер под управлением моего приложения windows 2000, я получаю предупреждение: warning C4996: ‘IsWin2000’: This.

Я получаю ошибку ‘strcpy’ и предупреждение для следующих строк: _tcscpy(strCommandLine,_T(MyProgram.exe /param1)); _tcscpy(strApplicationName,_T(MyProgram.exe)); Не уверен, почему я получаю ошибку.

Я пишу код в VS2010, и я вижу, что после компиляции компилятор дает мне предупреждение C4996 (эта функция или переменная может быть небезопасной) для вызовов strcpy и sprintf. Однако я не мог.

У меня есть предупреждение уровня 4 в моем проекте C++ я хочу решить его предупреждение Предупреждение 1 предупреждение C4996: ‘gmtime’: эта функция или переменная может быть опасный. Рассмотрите.

Считать: void takeInput() < string word; cin >> word; int n = word.length(); // Declaring character array char *char_array = new char [n + 1]; // Copying the contents of the // string to char.

Я получаю следующее предупреждение warning C4996: ‘std::_Uninitialized_copy0’: Function call with parameters that may be unsafe — this call relies on the caller to check that the passed values are.

предупреждение C4996: ‘getch’: имя POSIX для этого элемента является устаревшим. Вместо этого используйте имя соответствия ISO C++: _getch.

У меня есть 4 заголовочных файла, все они открывают данные из файла txt с _wfopen(), как показано ниже: FILE* file = _wfopen(Ldata.txt,Lr,ccs=utf-8); VC++ дает мне ошибку C4996, но только в одном.

Я знаю, что есть похожий вопрос уже на SO, но я хочу знать свои варианты для этого конкретного случая. MSVC компилятор выдает предупреждение о strcpy: 1>c:somethingmycontrol.cpp(65): warning.

Полное предупреждающее сообщение: предупреждение C4996: ‘SQLSetConnectOption’: ODBC API: SQLSetConnectOption устарело. Пожалуйста, используйте SQLSetConnectAttr вместо этого.

Ошибка C4996

Ошибка C4996 и WinSock2
Вот такая беда: не могу собрать проект написанный с использованный с использованием WinSock2.

Ошибка в getch: Error C4996
Здравствуйте. Не понимаю в чём ошибка. Вроде как не первый раз использую этот код, но в первые.

Ошибка C4996: ‘gets’: This function or variable may be unsafe
#include <iostream> #include <iostream> #include <conio.h> #include <string.h> #include.

Ошибка компилирования C4996 при вызове scanf
У мене выдает ошибку #include "stdafx.h" в visual studio 2015 но на visual studio 13 работет всё.

#pragma warning(disable:4996) и не помогли, как и #define _CRT_SECURE_NO_WARNINGS. а если fopen заменить на fopen_s, то пишет, что fopen_s не может принимать два значения.

Читать еще:  Принципы построения архитектуры

Добавлено через 1 минуту
полный текст ошибки: 1>c:usersниколайdocumentsvisual studio 2013projectsconsoleapplication8consoleapplication8consoleapplication8.cpp(18): error 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.
1> c:program files (x86)microsoft visual studio 12.0vcincludestdio.h(211) : see declaration of ‘fopen’

_CRT_SECURE_NO_WARNINGS — вот это вы где задефайнили? надо чтобы перед инклудом это было.
в вашем случае наверно это прям перед stdafx

nmcf, а как это сделать? у меня английская версия, плохо понимаю.

Добавлено через 15 минут
В общем в свойствах проекта прописал макрос — не помогло. Поменял уровень предупреждений — не помогло

Решение

Добавлено через 3 минуты
похоже, что это у меня в VS проблема.
DU2, спасибо.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка 1 error C4996: ‘scanf’: This function or variable may be unsafe
Здравствуйте , подскажите пожалуйста с задачками) есть 2 задачки по массивам с ошибкой не могу.

Ошибка 1 error C4996: ‘getche’: The POSIX name for this item is deprecated
Ошибка 1 error C4996: ‘getche’: The POSIX name for this item is deprecated. Instead, use the ISO.

Ошибка C4996 ‘strtok’: This function or variable may be unsafe. Consider using strtok_s instead
При запуске программы выдаёт ошибку: Ошибка C4996 ‘strtok’: This function or variable may be.

Ошибка error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead
#include <iostream> #include <cstring> #include <fstream> #include<string> #include<iomanip> .

Ошибка при работе с файлами: C4996: ‘fopen’: This function or variable may be unsafe
Помогите пожалуйста. писал программу, по данному заданию. вроде как все написал, но с файлами.

Ошибка «C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead»
error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To.

C4996 c ошибка

Answered by:

Question

How to fix this : Error 1 error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

I tried using strcpy_s but the following appeared:

Error 1 error C2660: ‘strcpy_s’ : function does not take 2 arguments c:usersalexandrosdocumentsvisual studio 2013projectslisting 4_20listing 4_20ptrstr.cpp 27 1 Listing 4_20

2 IntelliSense: no instance of overloaded function «strcpy_s» matches the argument list
argument types are: (char *, char [20]) c:UsersAlexandrosDocumentsVisual Studio 2013ProjectsListing 4_20Listing 4_20ptrstr.cpp 28 5 Listing 4_20

Using VS2013 ultimate

  • Edited by ClassicalGuitar Tuesday, August 11, 2015 12:03 PM

Answers

You allocate strlen(animal) of space for the ps variable, and then in the next line of code, lie to the strcpy_s function and state that you allocated sizeof(animal) number of characters.

  • Edited by Brian Muth Tuesday, August 11, 2015 7:09 PM
  • Marked as answer by Shu 2017 Moderator Monday, August 24, 2015 6:00 AM

If you can guarantee that the destination string has enough space to hold the source string including its null-terminator, just use strcpy() and ignore the compiling warning; if the compiling warning is carking, suppress it with
#define _CRT_SECURE_NO_WARNINGS
or
#pragma warning(disable : 4996)

You may also use
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
to let the compiler automatically replaces strcpy() with strcpy_s() for you. See at https://msdn.microsoft.com/en-us/library/ms175759.aspx

From the MSDN document about strcpy() and strcpy_s(), the main difference between both is that, if the destination space is not enough, while strcpy() proceeds in silence, strcpy_s() calls default Invalid Parameter Handler Routine to consciously crash the program and make you be awared of it with a report; see at https://msdn.microsoft.com/en-us/library/ksazx244.aspx.

You may overload the Invalid Parameter Handler Routine with your own function that not terminating the execution; in the case, strcpy_s() returns error; you are required to handle the program flow when the error happens.

If the destination and source strings overlap, the behaviors of strcpy() and strcpy_s() are undefined.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×