Повышение C ++: в чем причина этого предупреждения?

У меня есть простой C ++ с Boost, как это:

#include <boost/algorithm/string.hpp>

int main()
{
  std::string latlonStr = "hello,ergr()()rg(rg)";
  boost::find_format_all(latlonStr,boost::token_finder(boost::is_any_of("(,)")),boost::const_formatter(" "));

Это отлично работает; он заменяет каждое вхождение () на ""

Тем не менее, я получаю это предупреждение при компиляции:

Я использую MSVC 2008, Boost 1.37.0.

1>Compiling...
1>mainTest.cpp
1>c:\work\minescout-feat-000\extlib\boost\algorithm\string\detail\classification.hpp(102) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy'
1>        c:\work\minescout-feat-000\extlib\boost\algorithm\string\classification.hpp(206) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT>::is_any_ofF<boost::iterator_range<IteratorT>>(const RangeT &)' being compiled
1>        with
1>        [
1>            CharT=char,
1>            IteratorT=const char *,
1>            RangeT=boost::iterator_range<const char *>
1>        ]
1>        c:\work\minescout-feat-000\minescouttest\maintest.cpp(257) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT> boost::algorithm::is_any_of<const char[4]>(RangeT (&))' being compiled
1>        with
1>        [
1>            CharT=char,
1>            RangeT=const char [4]
1>        ]

Я мог бы отключить предупреждение, используя

-D_SCL_SECURE_NO_WARNINGS

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

Ответы на вопрос(6)

Перейдите в свойства вашего проекта C ++Разверните "C / C ++"Подсветка "Командная строка"В разделе «Дополнительные параметры» добавьте следующее к любому тексту, который может быть в этом поле

"-D_SCL_SECURE_NO_WARNINGS"

 Tom Sirgedas14 мар. 2013 г., 23:38
немного чище: добавьте «_SCL_SECURE_NO_WARNINGS» в разделе «Определения препроцессора» (который также находится в категории «C / C ++»)
 Jeff Benshetler26 февр. 2012 г., 20:16
Да, но в этом случае это все равно, что сказать: «Возьми свой зонтик, сегодня может пойти дождь». Говорят, что каждый день бесполезен, потому что он не дает никакой информации, даже в смысле Шеннона. В конце концов, пойдет дождь, и вас предупредят взять зонт. Если предупреждение звучало так: «Метеостанция предсказала, что сегодня дождь с вероятностью 80%, возьмите свой зонтик», то это полезно, поскольку оно предоставляет информацию.
 Bluebaron25 окт. 2011 г., 15:19
Помните, что даже если вы уверены, что ваш текущий код безопасен, вы можете в конечном итоге кодировать что-то небезопасное, и вас не будут предупреждать об этом.

еки Visual Studio, представленных начиная с MSVC 8.0. Microsoft определила «потенциально опасные» API и ввела предупреждения, препятствующие их использованию. Хотя технически возможно вызвать std :: copy небезопасным способом, 1) получение этого предупреждения не означает, что вы делаете это, и 2) использование std :: copy, как обычно, не опасно.

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(push) 
#pragma warning(disable:4996) 
#endif 

/* your code */ 

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(pop) 
#endif 
 neuviemeporte19 июл. 2012 г., 17:09
Не обязательно; например, заголовок <xutility>, который содержит реализацию std :: copy, помеченную как устаревшую и использование которой приводит к этому предупреждению, имеет предупреждение #pragma (push, 3) в самом верху, заставляя компилятор переопределить ваши настройки предупреждений с помощью Уровень 3 по умолчанию.

Разверните "C / C ++"

Дополнительно: Отключить определенные предупреждения:4996

Решение Вопроса

и в режим полной безопасности-паранойи.std::copy выдает это предупреждение, когда оно используется с необработанными указателями, потому чтопри неправильном использовании, это может привести к переполнению буфера.

Их реализация итератора выполняет проверку границ, чтобы гарантировать, что этого не произойдет, при значительных затратах производительности.

Так что не стесняйтесь игнорировать предупреждение. Это не значит, что с вашим кодом что-то не так. Это просто говорит, чтоесли что-то не так с вашим кодом, тогда произойдут плохие вещи. Что является странной вещью для выдачи предупреждений. ;)

 jalf19 авг. 2009 г., 19:58
самое страшное в этом то, что нет здравого смысла. Большинство предупреждений выдается, потому что есть лучший, менее подверженный ошибкам способ достижения того же самого. Они могут бытьисправлено, Что ты должен делать с этим? Если у вас есть необработанный массив C, и вам нужно скопировать данные в него или из него, указатели являются единственным доступным типом итераторов. std :: copy - безусловно, самый безопасный и безопасный вариант для использования. Или они предлагают нам вернуться к написанию циклов для достижения того же самого?
 sgryzko25 сент. 2014 г., 20:23
Как описано вэто Ответ на аналогичный (дублирующий?) вопрос, чтобы проигнорировать предупреждение в Visual Studio, перейдите кProject properties->C++->Advanced->Disable specific warnings и введите4996.
 Clay19 авг. 2009 г., 19:20
Это предупреждение сводит меня с ума, оно похоже на «предупреждение» о том, что содержимое чашки кофе горячее.
 Laserallan31 янв. 2012 г., 03:19
По иронии судьбы, обходной путь - использовать memcpy. С точки зрения безопасности это, вероятно, хуже, но компилятору это нравится.
 Hertzel Guinness19 дек. 2010 г., 17:03
Бьюсь об заклад 100 повторений, что он будет удален в первом SP вместе с другими "они не проверяют то, что выпускают?" вопросы...

если вы используете C ++ 11 и не хотите отключать предупреждения, у вас есть болезненный вариант замены

boost::is_any_of(L"(,)")

со следующим лямбда-выражением

[](wchar_t &c) { for (auto candidate : { L'(', L',', L')' }) { if (c == candidate) return true; }; return false; }

Вы также можете упаковать это в макрос

Ваш ответ на вопрос