C ++提升:这是什么警告的原因是什么?(C++ Boost: what's the cau

2019-07-01 17:53发布

我有一个简单的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年,升压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

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

Answer 1:

这是没有什么可担心的。 在MSVC的最后几个版本,他们已经走了充分的安全偏执模式。 std::copy时,它使用裸指针,因为不正确使用时 ,它会导致缓冲区溢出问题,此警告。

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

可以随意忽略警告。 这并不意味着有什么你的代码错误。 它只是说, 如果有什么问题与您的代码,那么不好的事情会发生。 这是发出关于警告一件奇怪的事。 ;)



Answer 2:

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

#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 


Answer 3:

如果你觉得禁用该错误的安全:

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

“-D_SCL_SECURE_NO_WARNINGS”



Answer 4:

警告来自于Visual Studio的非标准“安全”库中引入了开始MSVC 8.0的检查。 微软已经确定了“潜在的危险”的API,并注入了警告阻止其使用。 虽然这在技术上是可以调用的std ::以不安全的方式复制,1)接受此警告并不意味着你这样做,和2)使用std ::复制,你通常应该是没有危险的。



Answer 5:

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

  • 展开 “C / C ++”

  • 高级:禁用特定的警告:4996



Answer 6:

另外,如果您使用C ++ 11和不想关闭警告,必须更换的痛苦选择

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

用下面的lambda表达式

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

您也可以包可能是成宏



文章来源: C++ Boost: what's the cause of this warning?