2009-05-24 5 views
14

einige Code Haben Sie das nicht von mir und seine Herstellung dieser Warnung atm:Compilerfehler: Funktionsaufruf mit Parametern, die unsicher sein können

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

Dies ist der Code in Frage:

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

und Die Warnung bezieht sich auf die Zeile prepend.copy. Ich habe versucht, die Warnung zu googeln, kann aber nicht herausfinden, worum es geht. Kann mir bitte jemand helfen, das zu lösen?

Visual Studio 2005 SP1 Windows 7 RC1

.

Edit: prepend ist eine Zeichenkette, die auf die Warnung

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

Antwort

10

Die Warnung ist Ihnen zu sagen, dass Sie einen Pufferüberlauf riskieren, wenn n zu groß ist - was man nicht wissen kann, wegen der Art und Weise geschehen, die Sie gerade mit einem min berechnet, aber der arme commpiler nicht. Ich schlage vor, Sie nehmen den Compiler eigenen Rat und use -D_SCL_SECURE_NO_WARNINGS für diese eine Quelldatei ...

+4

ich endete mit #pragma warning (disable: 4996) als preprocessor define funktionierte nicht – Lodle

+0

@alex - es nicht behauptet, 'n' ist [potenziell] zu groß. Sie werden gewarnt, eine Funktion zu verwenden, die einen Zielzeiger ohne Zielgröße verwendet. Für das, was es wert ist, D_SCL_SECURE_NO_WARNINGS zu definieren, um Warnungen zu unterdrücken, ist eine schlechte Idee. – jww

+1

@Lodle - Odd, die 'Pragma Warnung (disable: 4996)' funktionierte nicht für mich in VS2010; Das Hinzufügen von '_SCL_SECURE_NO_WARNINGS' zu den Definitionen für jede einzelne Datei (und jeden separaten Build) schien den Trick zu machen. –

6

Schauen Sie sich diese MSDN-Seite für die Dokumentation typedefed ist

Die MS C++ Compiler entschieden deprecate Die Methode std :: string :: copy, da sie potenziell unsicher ist und zu einem Pufferüberlauf führen kann. Diese Einstellung ist Microsoft-spezifisch und wird wahrscheinlich nicht auf anderen Compilerplattformen angezeigt.

+1

so ist es sicher, es zu deaktivieren? Ich benutze Odeint Boost zum Lösen von Differentialgleichungen und dieser Fehler taucht auf. Ich benutze Visual Studio 2013. Ich habe '#pragma warning (disable: 4996)' benutzt und der Code funktioniert, aber ich bin mir nicht sicher, ob das sicher ist. Danke – CroCo