2009-05-24 6 views
14

Masz jakiś kod, który nie jest mój, a jego produkcją to ostrzeżenie atm:Compiler Error: Wywołanie funkcji z parametrami, które mogą być niebezpieczne

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

jest to kod w pytaniu:

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

i ostrzeżenie dotyczy linii prepend.copy. Próbowałem googling ostrzeżenie, ale nie mogę dowiedzieć się, co jest na temat. Czy ktoś może mi pomóc rozwiązać ten problem.

Visual Studio 2005 SP1 Windows 7 RC1

.

Edit: prepend jest ciągiem znaków, który jest typedefed

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

Odpowiedz

10

Ostrzeżenie jest informacją, że istnieje ryzyko przepełnienia bufora czy n jest zbyt duża - co wiesz, nie może się zdarzyć, ze względu na sposób, w jaki tylko obliczonego z min, ale ubogich commpiler nie. Proponuję wziąć własną poradę kompilatora i use -D_SCL_SECURE_NO_WARNINGS dla tego jednego pliku źródłowego ...

+4

skończyło się przy użyciu #pragma ostrzeżenie (wyłącz: 4996) jak preprocesor zdefiniować didnt pracy – Lodle

+0

@alex - jego nie twierdząc, "n" jest [potencjalnie] zbyt duży. Otrzymujesz ostrzeżenie o użyciu funkcji, która pobiera wskaźnik miejsca docelowego bez rozmiaru docelowego. Jak na razie warto, zdefiniowanie D_SCL_SECURE_NO_WARNINGS do pominięcia ostrzeżeń jest złym pomysłem. – jww

+1

@Lodle - Odd, "ostrzeżenie pragma (wyłącz: 4996)" nie działa dla mnie w VS2010; dodanie '_SCL_SECURE_NO_WARNINGS' do definicji dla każdego pojedynczego pliku (i każdej osobnej kompilacji) wydawało się działać. –

6

sprawdź na tej stronie MSDN dla dokumentacji na ostrzeżenia

MS C++ kompilator zdecydował się potępiać metoda std :: string :: copy, ponieważ jest potencjalnie niebezpieczna w użyciu i może prowadzić do przekroczenia bufora. To wycofanie jest specyficzne dla Microsoft i prawdopodobnie nie będziesz go widział na innych platformach kompilatora.

+1

, więc czy można go bezpiecznie wyłączyć? Używam boostu odint do rozwiązywania równań różniczkowych i pojawia się ten błąd. Używam visual studio 2013. Użyłem '#pragma warning (disable: 4996)' i kod działa, ale nie jestem pewien czy to jest bezpieczne. Dzięki – CroCo