编译器错误:带有可能不安全参数的函数调用

得到了一些不是我的代码,它产生这个警告atm:

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

这是有问题的代码:

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

警告是指prepend.copy行。 我试图用googlesearch这个警告,但是不能确定它是怎么回事。 请有人帮我解决这个问题。

Visual Studio 2005 SP1 Windows 7 RC1

编辑:prepend是一个string是typedefed

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

警告告诉你,如果n太大,你就冒着缓冲区溢出的风险 – 你知道因为你用min计算的方式不会发生,但是糟糕的commpiler不会。 我建议你采取编译器自己的建议,并use -D_SCL_SECURE_NO_WARNINGS这个源文件…

看看这个MSDN页面的警告文档

MS C ++编译器决定弃用std :: string :: copy方法,因为它可能不安全,可能会导致缓冲区溢出。 这种弃用是微软专用的,你可能不会在其他编译器平台上看到它。