46

私は次のようなBoostを備えた単純なC++を持っています:

#include <boost/algorithm/string.hpp>

int main()
{
  std::string latlonStr = "hello,ergr()()rg(rg)";
  boost::find_format_all(latlonStr,boost::token_finder(boost::is_any_of("(,)")),boost::const_formatter(" "));

これは正常に機能します。()のすべての出現箇所を「」に置き換えます

ただし、コンパイル時に次の警告が表示されます。

私はMSVC2008、Boost1.37.0を使用しています。

1>Compiling...
1>mainTest.cpp
1>c:\work\minescout-feat-000\extlib\boost\algorithm\string\detail\classification.hpp(102) : warning C4996: 'std::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'
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy'
1>        c:\work\minescout-feat-000\extlib\boost\algorithm\string\classification.hpp(206) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT>::is_any_ofF<boost::iterator_range<IteratorT>>(const RangeT &)' being compiled
1>        with
1>        [
1>            CharT=char,
1>            IteratorT=const char *,
1>            RangeT=boost::iterator_range<const char *>
1>        ]
1>        c:\work\minescout-feat-000\minescouttest\maintest.cpp(257) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT> boost::algorithm::is_any_of<const char[4]>(RangeT (&))' being compiled
1>        with
1>        [
1>            CharT=char,
1>            RangeT=const char [4]
1>        ]

私は確かに使用して警告を無効にすることができます

-D_SCL_SECURE_NO_WARNINGS

しかし、何が悪いのかを知る前に、あるいはもっと重要なことに、私のコードが間違っている場合は、それを行うのは少し気が進まない。

4

6 に答える 6

52

心配する必要はありません。MSVC の最後の数回のリリースでは、完全なセキュリティ パラノイア モードに移行しました。std::copy生のポインターで使用すると、この警告が発行されます。誤って使用すると、バッファー オーバーフローが発生する可能性があるためです。

彼らの反復子の実装は、これが起こらないように境界チェックを実行しますが、パフォーマンスが大幅に低下します。

そのため、警告は無視してかまいません。コードに問題があるという意味ではありません。コードに何か問題があると、悪いことが起こると言っているだけです。これは、警告を発する奇妙なことです。;)

于 2009-08-19T17:11:53.510 に答える
26

特定のヘッダーでこの警告を無効にすることもできます。

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(push) 
#pragma warning(disable:4996) 
#endif 

/* your code */ 

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(pop) 
#endif 
于 2011-01-26T13:59:14.827 に答える
19

このエラーを無効にしても問題ないと思われる場合:

  • C++ プロジェクトのプロパティに移動します
  • 「C/C++」を展開
  • 「コマンドライン」をハイライト
  • 「追加オプション」の下で、そのボックスにある可能性のあるテキストに次を追加します

" -D_SCL_SECURE_NO_WARNINGS"

于 2011-10-25T13:17:23.560 に答える
8

この警告は、MSVC 8.0 以降で導入された Visual Studio の非標準の「安全な」ライブラリ チェックから発生します。Microsoft は、"潜在的に危険な" API を特定し、その使用を思いとどまらせる警告を挿入しました。安全でない方法で std::copy を呼び出すことは技術的に可能ですが、1) この警告を受け取っても、そうしているわけではなく、2) std::copy を通常どおりに使用することは危険ではありません。

于 2009-08-19T17:14:14.600 に答える