Повышение C ++: в чем причина этого предупреждения? - PullRequest
46 голосов
/ 19 августа 2009

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

52 голосов
/ 19 августа 2009

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

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

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

25 голосов
/ 26 января 2011

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

#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 
19 голосов
/ 25 октября 2011

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

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

"-D_SCL_SECURE_NO_WARNINGS"

8 голосов
/ 19 августа 2009

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

1 голос
/ 28 апреля 2017
  • Перейдите в свойства вашего проекта C ++

  • Развернуть "C / C ++"

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

0 голосов
/ 24 мая 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...