2009-08-19 19 views
42

Mam proste C++ z Boost, jak poniżej:C++ Boost: co jest przyczyną tego ostrzeżenia?

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

Działa to dobrze; zastępuje wszystkie wystąpienia(), z „”

Jednak uzyskać to ostrzeżenie podczas kompilacji:

Używam MSVC 2008, zwiększyć 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>  ] 

Mógłbym oczywiście wyłączyć ostrzeżenie używając

-D_SCL_SECURE_NO_WARNINGS 

ale jestem trochę niechętny, aby to zrobić, zanim dowiem się, co się dzieje, albo co ważniejsze, czy mój kod jest nieprawidłowy.

Odpowiedz

50

Nie ma się czym martwić. W ostatnich kilku wydaniach MSVC przeszły one w tryb pełnego bezpieczeństwa - paranoja. std::copy wydaje to ostrzeżenie, gdy jest używane z surowymi wskaźnikami, ponieważ , gdy jest używany niepoprawnie, może spowodować przepełnienie bufora.

Ich implementacja iteratora wykonuje sprawdzanie granic w celu zapewnienia, że ​​tak się nie stanie, przy znaczących kosztach wydajności.

Możesz zignorować ostrzeżenie. To nie znaczy, że coś jest nie tak z twoim kodem. Mówi się, że jeśli coś jest nie tak z twoim kodem, wtedy coś złego się stanie. Co jest dziwną rzeczą do wydania ostrzeżeń na temat. ;)

+20

To ostrzeżenie doprowadza mnie do szału, przypomina "ostrzeżenie" o zawartości gorącej kawy. – Clay

+7

najgorsze jest to, że nie ma zdrowego "fix". Większość ostrzeżeń jest wydawanych, ponieważ istnieje lepszy, mniej podatny na błędy sposób osiągnięcia tego samego. Mogą być * naprawione *. Co masz z tym zrobić? Jeśli masz surową macierz C i musisz skopiować dane do lub z niej, wskaźniki są jedynym dostępnym typem iteratorów. std :: copy jest zdecydowanie najlepszą i najbezpieczniejszą opcją. A może sugerują, że wracamy do pisania na pętle, aby osiągnąć to samo? – jalf

+0

Założę 100 powtórzeń, że zostanie usunięty w pierwszym SP wraz z drugim "nie testują tego, co zwalniają?" problemy ... –

8

Ostrzeżenie pochodzi z niestandardowych "bezpiecznych" kontroli biblioteki Visual Studio wprowadzonych od wersji MSVC 8.0. Firma Microsoft zidentyfikowała "potencjalnie niebezpieczne" interfejsy API i wprowadziła ostrzeżenia, które zniechęcają do ich używania. Choć technicznie możliwe jest wywołanie std :: copy w niebezpieczny sposób, 1) otrzymanie tego ostrzeżenia nie oznacza, że ​​to robisz, i 2) używanie std :: copy, tak jak normalnie nie powinno być niebezpieczne.

23

Można również wyłączyć to ostrzeżenie w określonych nagłówków:

#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

Niekoniecznie; na przykład nagłówek , który zawiera implementację std :: copy oznaczoną jako przestarzałą i której użycie powoduje wyświetlenie tego ostrzeżenia, ma #pragma ostrzeżenie (push, 3) na samej górze, co powoduje, że kompilator zastępuje ustawienia ostrzeżeń poziomem 3 domyślne. – neuviemeporte

17

Jeśli czujesz się bezpieczny o wyłączenie tego błędu:

  • przejdź do właściwości dysku C++ projektu
  • rozwinąć " C/C++ "
  • Podświetl" Wiersz poleceń "
  • W" Opcjach dodatkowych "dodaj następujące do dowolnego tekstu, który może być w tym polu

"-D_SCL_SECURE_NO_WARNINGS"

+2

Pamiętaj, że nawet jeśli masz pewność, że Twój obecny kod jest bezpieczny, możesz w końcu napisać coś niebezpiecznego i nie zostaniesz ostrzeżony. – Bluebaron

+2

Tak, ale w tym przypadku jest tak, jakby powiedzieć: "Weź parasol, dziś może padać." Mówi się, że każdy dzień nie jest przydatny, ponieważ nie dostarcza żadnych informacji, nawet w rozumieniu Shannon. W końcu będzie padać i zostaniesz ostrzeżony, by zabrać parasol. Jeśli pojawiło się ostrzeżenie: "Stacja pogodowa przewidywała dzisiaj 80% szans na deszcz, weź parasol", to jest użyteczne, ponieważ dostarcza informacji. –

+5

odkurzacz: dodaj "_SCL_SECURE_NO_WARNINGS" pod definicjami preprocesora (który również znajduje się w kategorii "C/C++") –

0
  • przejdź do właściwości dysku C++ projektu

  • Rozwiń "C/C++"

  • Zaawansowane: Wyłącz konkretne ostrzeżenia:

Powiązane problemy