2009-08-19 12 views
42

que tienen un simple C++ con Boost así:C++ Boost: ¿cuál es la causa de esta advertencia?

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

Esto funciona bien; que sustituye todas las apariciones de(), con un ""

Sin embargo, me da esta advertencia al compilar:

estoy 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>  ] 

no me resultaba difícil desactivar la advertencia usando

-D_SCL_SECURE_NO_WARNINGS 

pero soy un poco reacio a hacerlo antes de que encuentre lo que está mal, o más importante aún si mi código es incorrecto.

Respuesta

50

No es nada de qué preocuparse. En las últimas versiones de MSVC, han entrado en modo de seguridad completa paranoia. std::copy problemas de esta advertencia cuando se utiliza con los punteros primas, porque cuando se usan incorrectamente , que puede dar lugar a desbordamientos de búfer.

Su aplicación iterador realiza comprobación de límites para asegurar que esto no suceda, a un costo de rendimiento significativa.

así que siéntase libre de ignorar la advertencia. No significa que haya algo mal con tu código. Sólo está diciendo que si hay algo mal con su código, entonces ocurrirán cosas malas. Cuál es una cosa extraña para emitir advertencias. ;)

+20

Esta advertencia me vuelve loco, es como la "advertencia" sobre el contenido de una taza de café caliente. – Clay

+7

Lo peor de todo es que no hay una "solución" sana. La mayoría de las advertencias se emiten porque hay una forma mejor y menos propensa a errores para lograr lo mismo. Se pueden * arreglar *. ¿Qué se supone que debes hacer al respecto? Si tiene una matriz en C sin procesar y necesita copiar datos desde o hacia ella, los punteros son el único tipo de iteradores disponibles. std :: copy es, de lejos, la mejor opción más segura de usar. ¿O están sugiriendo que volvamos a escribir para los bucles para lograr lo mismo? – jalf

+0

Apuesto 100 rep que se eliminará en el primer SP junto con el otro "¿No prueban lo que lanzan?" problemas ... –

8

La advertencia proviene de no estándar "seguros" chequeo de bibliotecas de Visual Studio incluye a partir MSVC 8.0. Microsoft ha identificado API "potencialmente peligrosas" y ha inyectado advertencias para desalentar su uso. Si bien es técnicamente posible llamar a std :: copy de una manera insegura, 1) recibir esta advertencia no significa que lo esté haciendo, y 2) usar std :: copy como lo haría normalmente no es peligroso.

23

También puede desactivar esta advertencia en las cabeceras específicas:

#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

No necesariamente; por ejemplo, el encabezado , que contiene una implementación de std :: copy marcado como obsoleto y cuyo uso produce esta advertencia, tiene #pragma warning (push, 3) en la parte superior, haciendo que el compilador anule su configuración de advertencia con Level 3 por defecto. – neuviemeporte

17

Si usted se siente seguro acerca de cómo deshabilitar este error:

  • Vaya a las propiedades de su proyecto C++
  • expandir el " C/C++ "
  • Resalte" Línea de comando "
  • En" Opciones adicionales "agregue lo siguiente a cualquier texto que puede haber en esa caja

"-D_SCL_SECURE_NO_WARNINGS"

+2

Recuerde que incluso si está seguro de que su código actual es seguro, es posible que eventualmente codifique algo inseguro y no se lo advierta. – Bluebaron

+2

Sí, pero en este caso es como decir: "Toma tu paraguas, puede llover hoy". Que le digan que todos los días no es útil porque no proporciona información, incluso en el sentido de Shannon. Eventualmente, lloverá y se te advertirá que tomes tu paraguas. Si la advertencia fue: "La estación meteorológica pronosticó lluvia hoy, 80% de probabilidad, toma tu paraguas", entonces eso es útil ya que proporciona información. –

+5

un poco más limpio: agregue "_SCL_SECURE_NO_WARNINGS" en Definiciones de preprocesador (que también se encuentra en la categoría "C/C++") –

0
  • Vaya a las propiedades de su proyecto C++

  • Ampliar el "C/C++"

  • Avanzado: deshabilitar advertencias específicas:

Cuestiones relacionadas