2009-08-19 67 views
42

我有一个简单的C++与升压像这样:C++ Boost:这个警告的原因是什么?

#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年,升压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 

的警告,但我有点不愿意这样做之前,我找出什么是错的,或者更重要的是,如果我的代码不正确。

回答

50

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

他们的迭代器实现执行边界检查,以确保这种情况不会发生,并且性能成本很高。

因此,请随时忽略警告。这并不意味着你的代码有什么问题。它只是说如果你的代码出了问题,那么坏事就会发生。 这是一个奇怪的事情发出警告。 ;)

+20

这个警告让我发疯,它就像一杯咖啡热的“警告”。 – Clay 2009-08-19 17:20:02

+7

最糟糕的是没有理智的“修复”。发布大多数警告是因为有更好的,更容易出错的方式来实现相同的目的。他们可以*固定*。你应该怎么做这件事?如果您有一个原始C数组,并且您需要将数据复制到其中或从中复制数据,则指针是唯一可用的迭代器类型。 std :: copy是迄今为止使用的最安全的选项。还是他们建议我们回去写循环来达到同样的目的? – jalf 2009-08-19 17:58:38

+0

我敢打赌100代表,它会在第一个SP和其他“不测试他们发布的东西吗?”中被删除。问题... – 2010-12-19 16:03:23

8

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

23

您也可以禁用特定的头这样的警告:

#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 
+7

不一定;例如,标题(其中包含std :: copy的实现标记为弃用且其用法产生此警告)在顶部具有#pragma警告(push,3),导致编译器覆盖级别3的警告设置默认值。 – neuviemeporte 2012-07-19 15:09:58

17

如果你觉得安全有关禁用此错误:

  • 转到您的C++项目的属性
  • 展开“ C/C++”
  • 高亮显示 “命令行”
  • 在 “其他选项” 追加以下任何文字,可能是在该框中

“-D_SCL_SECURE_NO_WARNINGS”

+2

请记住,即使您确定您当前的代码是安全的,您最终可能会编写一些不安全的代码,并且不会对此发出警告。 – Bluebaron 2011-10-25 13:19:55

+2

是的,但在这种情况下,就像说:“拿起你的雨伞,今天可能会下雨。”被告知每天都没有用,因为它没有提供任何信息,即使在香农的意义上。最终,它会下雨,你会被警告拿你的雨伞。如果警告是“天气预报今天降雨80%的几率,拿伞”,那么这是有用的,因为它提供的信息。 – 2012-02-26 19:16:48

+5

小小的清理工具:在预处理器定义下(也在“C/C++”类别下)添加“_SCL_SECURE_NO_WARNINGS” – 2013-03-14 22:38:00

0
  • 转到您的C++项目的属性

  • 展开 “C/C++”

  • 高级功能:禁用特定警告: