Ошибка компилятора: вызов функции с параметрами, которые могут быть небезопасными
Получил некоторый код, который не мой, и его создание этого предупреждения 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. Я попытался найти предупреждение, но не могу понять, о чем он. Может кто-нибудь помочь мне решить это, пожалуйста.
Visual Studio 2005 SP1
Windows 7 RC1
.
Изменить: prepend - это строка, которая набирается
typedef basic_string<char, char_traits<char>, allocator<char> > string;
Ответы
Ответ 1
Предупреждение сообщает вам, что вы рискуете переполнением буфера, если n
слишком велико, что, как вы знаете, не может произойти из-за того, как вы просто вычислили с помощью min
, но плохой компилятор не, Я предлагаю вам взять собственный совет компилятора и use -D_SCL_SECURE_NO_WARNINGS
для этого одного исходного файла...
Ответ 2
Проверьте эту страницу MSDN для документации по предупреждению
Компилятор MS С++ решил отказаться от метода std::string:: copy, поскольку он потенциально небезопасен для использования и может привести к переполнению буфера. Это отклонение является специфичным для Microsoft, и вы, вероятно, не увидите его на других платформах компилятора.