46 votes

C ++ Boost: quelle est la cause de cet avertissement?

J'ai un simple C ++ avec Boost comme ceci:

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

Cela fonctionne bien. il remplace chaque occurrence de () par un ""

Cependant, je reçois cet avertissement lors de la compilation:

J'utilise 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>        ]
 

Je pourrais certainement désactiver l'avertissement en utilisant

 -D_SCL_SECURE_NO_WARNINGS
 

mais je suis un peu réticent à le faire avant de découvrir ce qui ne va pas, ou plus important encore si mon code est incorrect.

52voto

jalf Points 142628

Il n'en est rien à s'inquiéter. Dans les dernières versions de MSVC, ils ont mis plein la sécurité de la paranoïa mode. std::copy questions de cet avertissement lorsqu'il est utilisé avec des pointeurs, car lorsque utilisé de manière incorrecte, il peut entraîner des dépassements de la mémoire tampon.

Leur itérateur de mise en œuvre effectue la vérification des limites pour s'assurer que cela n'arrive pas, à un coût de performance.

N'hésitez donc pas à ignorer l'avertissement. Cela ne signifie pas qu'il ya quelque chose de mal avec votre code. Il est juste de dire que si il ya quelque chose de mal avec votre code, puis de mauvaises choses vont arriver. Qui est une chose étrange à émettre des avertissements au sujet de. ;)

26voto

YeeLikeKram Points 1313

Vous pouvez également désactiver cet avertissement dans des en-têtes spécifiques:

 #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 
 

19voto

Bluebaron Points 356

Si vous vous sentez en sécurité pour désactiver cette erreur:

  • Accédez aux propriétés de votre projet C ++.
  • Développez le "C / C ++"
  • Mettez en surbrillance "Ligne de commande"
  • Sous "Options supplémentaires", ajoutez ce qui suit à tout texte pouvant figurer dans cette zone.

"-D_SCL_SECURE_NO_WARNINGS"

8voto

fbrereto Points 21711

Cet avertissement provient des vérifications de bibliothèque "sûres" non standard de Visual Studio introduites à partir de MSVC 8.0. Microsoft a identifié des API "potentiellement dangereuses" et a injecté des avertissements décourageant leur utilisation. Bien qu'il soit techniquement possible d'appeler std :: copy de manière non sécurisée, 1) recevoir cet avertissement ne signifie pas que vous le faites, et 2) utiliser std :: copy comme vous le devriez normalement n'est pas dangereux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X