2009-05-24 10 views
14

avuto qualche codice che non è mia e la sua produzione di questo avvertimento atm:Errore del compilatore: chiamata di funzione con parametri che può essere pericoloso

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

questo è il codice in questione:

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; 
    }; 

e l'avviso si riferisce alla linea prepend.copy. Ho provato a googling l'avvertimento, ma non riesco a capire di cosa si tratta. Qualcuno può aiutarmi a risolvere questo per favore.

Visual Studio 2005 SP1 Windows 7 RC1

.

Edit: anteporre è una stringa che viene typedefed

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

risposta

10

L'avviso vi sta dicendo che si rischia un buffer overflow se n è troppo grande - che si sa non può accadere a causa del modo che avete appena calcolato con un min, ma il povero commpiler non lo fa. Ti suggerisco di prendere il consiglio del compilatore e use -D_SCL_SECURE_NO_WARNINGS per questo file sorgente ...

+4

ho finito con l'uso di #pragma warning (disable: 4996) come il preprocessore define non ha funzionato – Lodle

+0

@alex - il suo non affermare 'n' è [potenzialmente] troppo grande. Si viene avvisati sull'utilizzo di una funzione che accetta un puntatore di destinazione senza una dimensione di destinazione. Per quello che vale, definire D_SCL_SECURE_NO_WARNINGS per sopprimere gli avvertimenti è una cattiva idea. – jww

+1

@Lodle - Dispari, il 'pragma warning (disable: 4996)' non ha funzionato per me in VS2010; aggiungere '_SCL_SECURE_NO_WARNINGS' ai define per ogni singolo file (e ogni build separata) sembrava fare il trucco. –

6

Guarda cosa MSDN per la documentazione sul sistema di allarme

Il compilatore MS C++ ha deciso di deprecate il metodo std :: string :: copy perché è potenzialmente pericoloso da usare e può portare a un sovraccarico del buffer. Questa deprecazione è specifica di Microsoft e probabilmente non la vedrai su altre piattaforme di compilazione.

+1

quindi è sicuro disabilitarlo? Sto usando il boost di odeint per risolvere equazioni differenziali e questo errore si apre. Sto usando Visual Studio 2013. Ho usato '#pragma warning (disable: 4996)' e il codice funziona ma non sono sicuro che sia sicuro. Grazie – CroCo

Problemi correlati