Ошибка компилятора: вызов функции с параметрами, которые могут быть небезопасными - PullRequest
15 голосов
/ 24 мая 2009

У меня есть код, который не мой, и он выдает предупреждение:

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;

Ответы [ 2 ]

12 голосов
/ 24 мая 2009

Предупреждение говорит о том, что вы рискуете переполнением буфера, если n слишком велико - что, как вы знаете, не может произойти из-за того, как вы только что вычислили с min, но плохой компилятор не , Я предлагаю вам воспользоваться собственным советом компилятора и use -D_SCL_SECURE_NO_WARNINGS для этого одного исходного файла ...

8 голосов
/ 24 мая 2009

Проверьте эту страницу MSDN для документации по предупреждению

Компилятор MS C ++ решил отказаться от метода std :: string :: copy, потому что он потенциально небезопасен и может привести к переполнению буфера. Это осуждение является специфическим для Microsoft, и вы, вероятно, не увидите его на других платформах компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...