2009-05-24 6 views
14

dieron un poco de código que no es la mía y su producción de este atm advertencia:compilador de error: llamada a función con parámetros que puede ser inseguro

iehtmlwin.cpp(264) : warning C4996: 'std::basic_string<_Elem,_Traits,_Ax>::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' 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Ax=std::allocator<char> 
     ] 
     c:\program files (x86)\microsoft visual studio 8\vc\include\xstring(1680) : see declaration of 'std::basic_string<_Elem,_Traits,_Ax>::copy' 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Ax=std::allocator<char> 
     ] 

este es el código en cuestión:

HRESULT STDMETHODCALLTYPE Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead) 
    { 
     if (prepend.size() > 0) 
     { 
      int n = min(prepend.size(), cb); 
      prepend.copy((char *) pv, n); 
      prepend = prepend.substr(n); 
      if (pcbRead) 
       *pcbRead = n; 

      return S_OK; 
     }; 

     int rc = Read((char *) pv, cb); 
     if (pcbRead) 
      *pcbRead = rc; 

     return S_OK; 
    }; 

y la advertencia se refiere a la línea prepend.copy. He intentado buscar en Google la advertencia pero no puedo entender de qué se trata. ¿Puede alguien ayudarme a resolver esto por favor?

Visual Studio 2005 SP1 Windows 7 RC1

.

Editar: anteponer es una cadena que se typedefed

typedef basic_string<char, char_traits<char>, allocator<char> > string; 

Respuesta

10

La advertencia le indica que se arriesga a un desbordamiento del búfer si n es demasiado grande, lo que usted sabe no puede suceder debido a la forma en que acaba de calcular con min, pero el commeril no funciona. Le sugiero que tome los consejos del compilador y use -D_SCL_SECURE_NO_WARNINGS para este archivo de origen ...

+4

terminé usando la advertencia #pragma (desactivar: 4996) ya que el preprocesador define no funcionó – Lodle

+0

@alex - no afirma que 'n' es [potencialmente] demasiado grande. Se le advierte sobre el uso de una función que toma un puntero de destino sin un tamaño de destino. Por lo que vale, la definición de D_SCL_SECURE_NO_WARNINGS para suprimir las advertencias es una mala idea. – jww

+1

@Lodle - Extraño, la advertencia 'pragma (deshabilitar: 4996)' no funcionó para mí en VS2010; agregar '_SCL_SECURE_NO_WARNINGS' a las definiciones para cada archivo individual (y cada compilación separada) parecía ser el truco. –

6

Consulte esta página de MSDN para la documentación sobre la advertencia

El compilador MS C++ decidió despreciar el método std :: string :: copy porque es potencialmente inseguro de usar y puede llevar a un desbordamiento del búfer. Esta degradación es específica de Microsoft y es probable que no la vea en otras plataformas de compilación.

+1

así que ¿es seguro deshabilitarlo? Estoy usando odeint boost para resolver ecuaciones diferenciales y aparece este error. Estoy usando Visual Studio 2013. Usé '#pragma warning (disable: 4996)' y el código está funcionando, pero no estoy seguro si esto es seguro. Gracias – CroCo

Cuestiones relacionadas