web-dev-qa-db-ja.com

C ++ Boost:この警告の原因は何ですか?

次のような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(" "));

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

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

MSVC 2008、Boost 1.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

しかし、何が悪いのかを見つける前に、あるいはもっと重要なのは、コードが正しくない場合にそれを行うことに少し消極的です。

46
sivabudh

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

彼らのイテレータ実装は、これが起こらないことを保証するために境界チェックを実行しますが、かなりのパフォーマンスコストがかかります。

警告を無視してかまいません。コードに問題があるという意味ではありません。 ifコードに問題があると、悪いことが起こります。警告を出すのは奇妙なことです。 ;)

52
jalf

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

#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 
25
Bizmarck

このエラーを無効にしても問題がなければ:

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

「-D_SCL_SECURE_NO_WARNINGS」

19
Bluebaron

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

8
fbrereto

または、C++ 11を使用していて警告をオフにしたくない場合は、交換するという面倒なオプションがあります

boost::is_any_of(L"(,)")

次のラムダ式

[](wchar_t &c) { for (auto candidate : { L'(', L',', L')' }) { if (c == candidate) return true; }; return false; }

それをマクロにパックすることもできます

1
Alex Azzalini
  • C++プロジェクトのプロパティに移動します

  • 「C/C++」を展開する

  • 詳細設定:特定の警告を無効にする:4996

1
sailfish009