web-dev-qa-db-fra.com

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.

44
sivabudh

Il n'y a rien à craindre. Dans les dernières versions de MSVC, ils sont passés en mode sécurité complète paranoïa. std::copy émet cet avertissement lorsqu'il est utilisé avec des pointeurs bruts, car utilisé incorrectement , il peut en résulter des dépassements de mémoire tampon.

Leur implémentation d'itérateur effectue une vérification des limites pour s'assurer que cela ne se produit pas, à un coût de performance significatif.

Alors n'hésitez pas à ignorer l'avertissement. Cela ne signifie pas qu'il y a quelque chose qui cloche dans votre code. Cela signifie simplement que si il y a quelque chose qui ne va pas dans votre code, alors de mauvaises choses vont arriver ... C'est une chose étrange de donner des avertissements. ;)

52
jalf

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

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 éventuellement présent dans cette case

"-D_SCL_SECURE_NO_WARNINGS"

18
Bluebaron

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.

8
fbrereto
  • Accédez aux propriétés de votre projet C++.

  • Développez le "C/C++"

  • Avancé: Désactiver les avertissements spécifiques: 4996

1
sailfish009

Sinon, si vous utilisez C++ 11 et que vous ne voulez pas désactiver les avertissements, vous avez la pénible option de remplacer 

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

avec l'expression lambda suivante

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

Vous pouvez aussi éventuellement mettre cela dans une macro

0
Alex Azzalini