2009-08-19 18 views
42

Ho un semplice C++ con Boost in questo modo:C++ Boost: qual è la causa di questo avviso?

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

Questo funziona bene; sostituisce ogni occorrenza di(), con un ""

Tuttavia, ottengo questo avvertimento quando si compila:

sto usando 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>  ] 

mi potrebbe certamente disattivare l'avviso utilizzando

-D_SCL_SECURE_NO_WARNINGS 

ma io sono un po 'riluttante a farlo prima di scoprire che cosa c'è che non va, o ancora più importante se il mio codice non è corretto.

risposta

50

Non c'è niente di cui preoccuparsi. Negli ultimi rilasci di MSVC, sono entrati in piena sicurezza, la modalità paranoia. std::copy emette questo avviso quando viene utilizzato con puntatori non elaborati, perché se utilizzato in modo errato, può causare overflow del buffer.

L'implementazione iteratore esegue il controllo dei limiti per garantire che ciò non accada, a un costo significativo delle prestazioni.

Quindi sentitevi liberi di ignorare l'avviso. Ciò non significa che ci sia qualcosa di sbagliato nel tuo codice. Si sta solo dicendo che se c'è qualcosa che non va nel tuo codice, quindi accadranno cose brutte. Qual è una cosa strana da cui emettere avvisi. ;)

+20

Questo avviso mi fa impazzire, è come un "avvertimento" sul contenuto di una tazza di caffè caldo. – Clay

+7

la cosa peggiore è che non esiste una "correzione" sana. La maggior parte degli avvertimenti viene emessa perché esiste un modo migliore, meno incline agli errori, per ottenere la stessa cosa. Possono essere * riparati *. Cosa dovresti fare su questo? Se si dispone di un array C non elaborato ed è necessario copiare i dati da o verso di essi, i puntatori sono l'unico tipo di iteratore disponibile. std :: copy è di gran lunga la migliore opzione più sicura da usare. O stanno suggerendo che torniamo a scrivere per loops per ottenere la stessa cosa? – jalf

+0

Scommetto 100 rep che verrà rimosso nel primo SP insieme all'altro "non testano ciò che rilasciano?" problemi ... –

8

L'avviso proviene dai controlli di libreria "sicuri" non standard di Visual Studio introdotti a partire da MSVC 8.0. Microsoft ha identificato API "potenzialmente pericolose" e ha iniettato avvisi che scoraggiano il loro utilizzo. Mentre è tecnicamente possibile chiamare std :: copy in un modo non sicuro, 1) ricevere questo avviso non significa che lo stai facendo, e 2) usare std :: copy come normalmente non dovrebbe essere pericoloso.

23

È possibile anche disattivare l'avviso nelle intestazioni specifiche:

#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

Non necessariamente; ad esempio l'intestazione , che contiene un'implementazione di std :: copy contrassegnata come deprecata e il cui utilizzo produce questo avviso, ha #pragma warning (push, 3) nella parte superiore, facendo in modo che il compilatore sovrascriva le impostazioni di avviso con Level 3 impostazioni predefinite. – neuviemeporte

17

Se ti senti al sicuro sulla disattivazione di questo errore:

  • Passare alle proprietà del C++ progetto
  • espandere la " C/C++ "
  • Evidenzia" Riga di comando "
  • In" Opzioni aggiuntive "aggiungere il seguente a qualsiasi testo che potrebbe essere in quella scatola

"-D_SCL_SECURE_NO_WARNINGS"

+2

Ricorda che anche se sei sicuro che il tuo codice attuale è sicuro, potresti eventualmente codificare qualcosa di non sicuro e non verrai avvisato. – Bluebaron

+2

Sì, ma in questo caso è come dire: "Prendi l'ombrello, potrebbe piovere oggi". Viene detto che ogni giorno non è utile perché non fornisce informazioni, nemmeno nel senso di Shannon. Alla fine, pioverà e sarai stato avvertito di prendere il tuo ombrello. Se l'avvertimento era: "La stazione meteorologica ha previsto pioggia oggi l'80% di possibilità, prendi il tuo ombrello", quindi è utile poiché fornisce informazioni. –

+5

un po 'più pulito: aggiungi "_SCL_SECURE_NO_WARNINGS" in Preprocessor Definitions (che si trova anche nella categoria "C/C++") –

0
  • Passare alle proprietà del C++ progetto

  • Espandere la "C/C++"

  • Avanzate: disabilita gli avvisi specifici:

Problemi correlati