12

この警告メッセージが表示されました..しかし、問題がどこにあるのかわかりません..!

含む

#pragma warning(push)
#pragma warning(disable:4996) 
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/insert_linebreaks.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <boost/archive/iterators/ostream_iterator.hpp>
#pragma warning(pop)

そして警告

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2227): warning C4996: 'std::_Copy_impl': 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'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2212): Siehe Deklaration von 'std::_Copy_impl'
1>          c:\users\perlig\documents\visual studio 2010\projects\restmanager\restmanager\**http.cpp(257)**: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::copy<boost::archive::iterators::insert_linebreaks<Base,N>,boost::archive::iterators::ostream_iterator<Elem>>(_InIt,_InIt,_OutIt)".
1>          with
1>          [
1>              _OutIt=boost::archive::iterators::ostream_iterator<char>,
1>              Base=boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,6,8>>,
1>              N=76,
1>              Elem=char,
1>                _InIt=boost::archive::iterators::insert_linebreaks<boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,6,8>>,76>
1>          ]

警告メッセージが示すように、コードは257行目に発生します。しかし、何が悪いのか分からないので、私はそれを修正することはできません..

文字列データには、http 経由の基本認証用の「user:password」文字列が含まれています。

http.cpp(257):

// typdef, prepare
using namespace boost::archive::iterators;
stringstream os;
typedef 
    insert_linebreaks<         // insert line breaks every 72 characters
        base64_from_binary<    // convert binary values ot base64 characters
            transform_width<   // retrieve 6 bit integers from a sequence of 8 bit bytes
                const char *,
                6,
                8
            >
        > 
        ,76
    > 
    base64_text; // compose all the above operations in to a new iterator

// encrypt
#pragma warning(push)
#pragma warning(disable:4996)
copy( //<<<<<------ LINE 257
    base64_text(data.c_str()),
    base64_text(data.c_str() + data.size()),
    boost::archive::iterators::ostream_iterator<char>(os)
);
#pragma warning(pop)

誰かが何か考えましたか?

4

1 に答える 1

12

警告の意味はご存知だと思いますが、まず警告について説明し、次に警告を取り除くために何をすべきかを説明します。Microsoftは、CRT、STL、MFCなどに新しいセキュリティ対応の機能セットを実装し、これらの機能の古いバージョンを非推奨としてマークして、新しい安全なバージョンに移行する必要があるというヒントを提供します。つまり、std::copyは安全ではありません!! どうやって?次のように:

char storage[ 10 ], *p = storage;
std::copy( std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), p );

ユーザーが10intを超えて入力するとどうなりますか?メモリが上書きされ、メモリが破損します。

使用boost::archive::iterators::ostream_iteratorは完全に安全ですが、MSVCの安全なイテレータの設計に準拠していないため、安全でないと見なされます。

ここで、フラグ-D_SCL_SECURE_NO_WARNINGScl入力してこの警告を無効にするか、この警告を無効にするためにaを追加するpragma必要があります(そうするように)が、プラグマが機能しないのはなぜですか?

理由は明らかです。このプラグマはスコープで機能し、プラグマを使用するスコープには問題はありませんxutility。このプラグマで保護する必要があり、すべてが期待どおりに機能します。

于 2012-10-03T20:26:46.897 に答える