С++ 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