2009-08-19 8 views
42

Ich habe eine einfache C++ mit Boost-wie folgt aus:C++ Boost: Was ist die Ursache dieser Warnung?

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

Dies funktioniert gut; es ersetzt jedes Vorkommen von() mit einem „“

Allerdings habe ich diese Warnung beim Kompilieren:

Ich bin mit MSVC 2008 1.37.0 steigern.

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 sicherlich die Warnung

-D_SCL_SECURE_NO_WARNINGS 

mit deaktivieren, aber ich bin ein bisschen zögern, das zu tun, bevor ich herausfinden, was falsch ist, oder was noch wichtiger ist, wenn mein Code nicht korrekt ist.

Antwort

50

Es ist nichts zu befürchten. In den letzten Releases von MSVC sind sie in den vollen Sicherheits-Paranoia-Modus gegangen. std::copy gibt diese Warnung aus, wenn sie mit unformatierten Zeigern verwendet wird, da bei falscher Verwendung zu Pufferüberläufen führen kann.

Ihre Iterator-Implementierung führt eine Überprüfung der Grenzen durch, um sicherzustellen, dass dies nicht geschieht, und dies zu erheblichen Leistungskosten.

So zögern Sie nicht, die Warnung zu ignorieren. Es bedeutet nicht, dass Ihr Code falsch ist. Es sagt nur, dass wenn ist etwas mit Ihrem Code falsch ist, dann werden schlimme Dinge passieren. Was ist eine seltsame Sache, über die Warnungen ausgegeben werden. ;)

+20

Diese Warnung macht mich verrückt, es ist wie die "Warnung" über den Inhalt einer heißen Tasse Kaffee. – Clay

+7

Das Schlimmste daran ist, dass es keine vernünftige "Reparatur" gibt. Die meisten Warnungen werden ausgegeben, weil es einen besseren, weniger fehleranfälligen Weg gibt, dasselbe zu erreichen. Sie können * behoben * werden. Was sollst du mit diesem tun? Wenn Sie ein Raw-C-Array haben und Daten zu oder von ihm kopieren müssen, sind Zeiger die einzige Art von Iteratoren, die verfügbar sind. std :: copy ist mit Abstand die beste und sicherste Option. Oder schlagen sie vor, dass wir wieder für Loops schreiben, um dasselbe zu erreichen? – jalf

+0

Ich wette 100 rep, dass es in der ersten SP zusammen mit den anderen entfernt werden "testen sie nicht, was sie veröffentlichen?" Probleme ... –

8

Die Warnung stammt von den nicht standardmäßigen "sicheren" Bibliotheksprüfungen von Visual Studio, die ab MSVC 8.0 eingeführt wurden. Microsoft hat "potentiell gefährliche" APIs identifiziert und Warnungen ausgegeben, die deren Verwendung verhindern. Während es technisch möglich ist, std :: copy auf unsichere Weise aufzurufen, bedeutet 1) das Empfangen dieser Warnung nicht, dass Sie dies tun, und 2) das Verwenden von std :: copy, wie Sie normalerweise sollten, ist nicht gefährlich.

23

Sie können auch diese Warnung in bestimmten Header 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 
+7

Nicht unbedingt; Zum Beispiel hat der Header , der eine Implementierung von std :: copy enthält, die als veraltet gekennzeichnet ist und deren Verwendung diese Warnung liefert, ganz oben mit #pragma warning (push, 3), was dazu führt, dass der Compiler die Warneinstellungen mit Level 3 überschreibt Standardeinstellungen. – neuviemeporte

17

Wenn Sie deaktivieren diesen Fehler sicher fühlen:

  • Gehen Sie auf die Eigenschaften von C++ Projekt
  • Expand " C/C++ "
  • Markieren Sie" Command Line "
  • Unter" Zusätzliche Optionen "fügen Sie Folgendes hinzu einen Text, der in diesem Feld

"-D_SCL_SECURE_NO_WARNINGS"

+2

Denken Sie daran, dass Sie, selbst wenn Sie sicher sind, dass Ihr aktueller Code sicher ist, möglicherweise etwas unsicheres programmieren und Sie nicht davor gewarnt werden. – Bluebaron

+2

Ja, aber in diesem Fall ist es wie: "Nimm deinen Regenschirm, es kann heute regnen." Es wird gesagt, dass jeder Tag nicht nützlich ist, weil er keine Informationen liefert, auch nicht im Sinne von Shannon. Irgendwann wird es regnen und Sie werden gewarnt, Ihren Regenschirm zu nehmen. Wenn die Warnung war: "Wetterstation vorhergesagten Regen heute 80% Chance, nehmen Sie Ihren Regenschirm", dann ist das nützlich, da es Informationen liefert. –

+5

ein wenig sauberer: fügen Sie "_SCL_SECURE_NO_WARNINGS" unter Preprozessor-Definitionen (die auch unter der Kategorie "C/C++") –

0
  • Gehen Sie auf die Eigenschaften von C++ Projekt

  • Erweitern Sie den "C/C++"

  • sein könnte

    Erweitert: Spezielle Warnungen deaktivieren:

Verwandte Themen