C ++ Boost:这个警告的原因是什么?

时间:2009-08-19 17:02:42

标签: c++ boost compiler-warnings

我有一个像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

但在我发现错误之前,我有点不愿意这样做,或者更重要的是,如果我的代码不正确。

6 个答案:

答案 0 :(得分:52)

没什么好担心的。在MSVC的最后几个版本中,他们已经进入完全安全 - 偏执模式。 std::copy在与原始指针一起使用时会发出此警告,因为使用不正确时,会导致缓冲区溢出。

它们的迭代器实现执行边界检查以确保不会发生这种情况,从而导致性能成本显着。

所以随意忽略警告。这并不意味着您的代码有任何问题。它只是说如果你的代码有问题,那么坏事就会发生。 发出警告是一件奇怪的事情。 ;)

答案 1 :(得分:25)

您还可以在特定标题中禁用此警告:

#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 

答案 2 :(得分:19)

如果您对禁用此错误感到安全:

  • 转到C ++项目的属性
  • 展开“C / C ++”
  • 突出显示“命令行”
  • 在“其他选项”下,将以下内容添加到该框中可能包含的任何文本

“ - D_SCL_SECURE_NO_WARNINGS”

答案 3 :(得分:8)

警告来自Visual Studio从MSVC 8.0开始引入的非标准“安全”库检查。微软已经确定了“具有潜在危险”的API,并且已经注意到了阻止其使用的警告。虽然技术上可以以不安全的方式调用std :: copy,但是1)接收此警告并不意味着你这样做,并且2)正常情况下使用std :: copy并不危险。

答案 4 :(得分:1)

  • 转到C ++项目的属性

  • 展开&#34; C / C ++&#34;

  • 高级:停用特定警告: 4996

答案 5 :(得分:0)

或者,如果您使用C ++ 11并且不想关闭警告,则可以选择更换

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

使用以下lambda表达式

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

您也可以将其打包成宏