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(" "));

这很好用;它将 ( ) 的每次出现都替换为 " "

但是,我在编译时收到此警告:

我正在使用 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

但在我找出问题所在之前,或者更重要的是,如果我的代码不正确,我有点不愿意这样做。

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 的非标准“安全”库检查。微软已经确定了“潜在危险”的 API,并注入了阻止其使用的警告。虽然在技术上可以以不安全的方式调用 std::copy,但 1) 收到此警告并不意味着您正在这样做,并且 2) 按照您通常应该的方式使用 std::copy 并不危险。

于 2009-08-19T17:14:14.600 回答
2

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

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

使用以下 lambda 表达式

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

您也可以将其打包到宏中

于 2018-05-24T12:48:07.970 回答
1
  • 转到 C++ 项目的属性

  • 展开“C/C++”

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

于 2017-04-28T07:06:18.707 回答