webentwicklung-frage-antwort-db.com.de

C++ Boost: Was ist die Ursache dieser Warnung?

Ich habe ein einfaches C++ mit Boost wie folgt:

#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(" "));

Das funktioniert gut; es ersetzt jedes Vorkommen von () durch ein ""

Diese Warnung erhalte ich jedoch beim Kompilieren:

Ich verwende 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>        ]

Ich könnte die Warnung sicher mit deaktivieren

-D_SCL_SECURE_NO_WARNINGS

aber ich zögere ein bisschen, das zu tun, bevor ich herausfinde, was falsch ist, oder was noch wichtiger ist, wenn mein Code falsch ist.

44
sivabudh

Es ist nichts zu befürchten. In den letzten Versionen von MSVC haben sie sich in den Paranoia-Modus für vollständige Sicherheit versetzt. std::copy gibt diese Warnung aus, wenn es mit unformatierten Zeigern verwendet wird, da bei falscher Verwendung zu Pufferüberläufen führen kann.

Ihre Iterator-Implementierung führt eine Begrenzungsprüfung durch, um sicherzustellen, dass dies nicht geschieht, und dies zu erheblichen Kosten.

Fühlen Sie sich frei, die Warnung zu ignorieren. Das bedeutet nicht, dass Ihr Code fehlerhaft ist. Es wird nur gesagt, dass wenn etwas mit Ihrem Code nicht stimmt, dann werden schlimme Dinge passieren. Was ist eine seltsame Sache, über die Sie gewarnt werden. ;)

52
jalf

Sie können diese Warnung auch in bestimmten Kopfzeilen deaktivieren:

#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 
24
Bizmarck

Wenn Sie sich bei der Deaktivierung dieses Fehlers sicher fühlen:

  • Wechseln Sie zu den Eigenschaften Ihres C++ - Projekts
  • Erweitern Sie "C/C++"
  • Markieren Sie "Befehlszeile"
  • Fügen Sie unter "Zusätzliche Optionen" Folgendes an jeden Text an, der sich in diesem Feld befindet

"-D_SCL_SECURE_NO_WARNINGS"

18
Bluebaron

Die Warnung stammt von nicht standardmäßigen "sicheren" Bibliotheksüberprüfungen von Visual Studio, die ab MSVC 8.0 eingeführt wurden. Microsoft hat "potenziell gefährliche" APIs identifiziert und Warnungen eingefügt, die deren Verwendung abschrecken. Obwohl es technisch möglich ist, std :: copy auf eine unsichere Art und Weise aufzurufen, bedeutet 1), dass diese Warnung nicht angezeigt wird, und 2) die Verwendung von std :: copy, wie Sie es normalerweise tun sollten, nicht gefährlich ist.

8
fbrereto
  • Wechseln Sie zu den Eigenschaften Ihres C++ - Projekts

  • Erweitern Sie "C/C++"

  • Erweitert: Deaktivieren bestimmter Warnungen: 4996

1
sailfish009

Wenn Sie alternativ C++ 11 verwenden und Warnungen nicht deaktivieren möchten, haben Sie die schmerzhafte Option zum Ersetzen 

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

mit dem folgenden Lambda-Ausdruck

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

Sie können das möglicherweise auch in ein Makro packen

0
Alex Azzalini