15

私のものではないコードを取得し、この警告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はtypedefedされた文字列です

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

2 に答える 2

13

n警告は、が大きすぎるとバッファ オーバーフローの危険性があることをmin示しています。use -D_SCL_SECURE_NO_WARNINGSこの 1 つのソース ファイルについては、コンパイラの独自のアドバイスに従うことをお勧めします...

于 2009-05-24T04:31:59.843 に答える
8

警告に関するドキュメントについては、この MSDN ページを確認してください。

MS C++ コンパイラは、メソッド std::string::copy を廃止することを決定しました。これは、安全に使用できない可能性があり、バッファ オーバーランを引き起こす可能性があるためです。この非推奨は Microsoft 固有のものであり、他のコンパイラ プラットフォームでは見られない可能性があります。

于 2009-05-24T04:30:32.620 に答える