С++ Boost: какова причина этого предупреждения?

У меня есть простой С++ с 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

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

Ответ 1

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

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

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

Ответ 2

Вы также можете отключить это предупреждение в определенных заголовках:

#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 

Ответ 3

Если вы уверены, что отключите эту ошибку:

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

"-D_SCL_SECURE_NO_WARNINGS"

Ответ 4

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

Ответ 5

  • Перейдите к свойствам вашего проекта на С++

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

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