我得到这个警告信息..但我不知道什么/在哪里的问题是..
- #pragma warning(push)
- #pragma warning(disable:4996)
- #include <boost/archive/iterators/base64_from_binary.hpp>
- #include <boost/archive/iterators/insert_linebreaks.hpp>
- #include <boost/archive/iterators/transform_width.hpp>
- #include <boost/archive/iterators/ostream_iterator.hpp>
- #pragma warning(pop)
和警告
- 1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2227): warning C4996: 'std::_Copy_impl': 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 10.0\vc\include\xutility(2212): Siehe Deklaration von 'std::_Copy_impl'
- 1> c:\users\perlig\documents\visual studio 2010\projects\restmanager\restmanager\**http.cpp(257)**: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::copy<boost::archive::iterators::insert_linebreaks<Base,N>,boost::archive::iterators::ostream_iterator<Elem>>(_InIt,_InIt,_OutIt)".
- 1> with
- 1> [
- 1> _OutIt=boost::archive::iterators::ostream_iterator<char>,1> Base=boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,6,8>>,1> N=76,1> Elem=char,1> _InIt=boost::archive::iterators::insert_linebreaks<boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,76>
- 1> ]
代码发生在第257行,因为警告消息说.但我无法解决它,因为我不知道是什么错误..
字符串数据包含通过http的基本身份验证的“用户:密码”字符串.
http.cpp(257):
- // typdef,prepare
- using namespace boost::archive::iterators;
- stringstream os;
- typedef
- insert_linebreaks< // insert line breaks every 72 characters
- base64_from_binary< // convert binary values ot base64 characters
- transform_width< // retrieve 6 bit integers from a sequence of 8 bit bytes
- const char *,8
- >
- >,76
- >
- base64_text; // compose all the above operations in to a new iterator
- // encrypt
- #pragma warning(push)
- #pragma warning(disable:4996)
- copy( //<<<<<------ LINE 257
- base64_text(data.c_str()),base64_text(data.c_str() + data.size()),boost::archive::iterators::ostream_iterator<char>(os)
- );
- #pragma warning(pop)
有人有什么想法吗?
解决方法
我想你知道警告的意思是什么,但首先我会描述警告,然后说出如何去做. Microsoft在其CRT,STL,MFC …中实现了新的安全启用功能集,并将旧版本的这些功能标记为不推荐使用,为您提供一个提示,您应该迁移到新的安全版本.所以说std :: copy是不安全的!怎么样?如下:
- char storage[ 10 ],*p = storage;
- std::copy( std::istream_iterator<int>(std::cin),std::istream_iterator<int>(),p );
现在如果用户输入10多个int会发生什么?内存将被覆盖,您的内存损坏.
使用boost :: archive :: iterators :: ostream_iterator是完全安全的,但是由于它不遵循MSVC中安全迭代器的设计,所以它将被视为不安全的.
现在你应该禁用-D_SCL_SECURE_NO_WARNINGS的这个警告来cl输入标志,或添加一个pragma来禁用这个警告(就像你这样做),但为什么pragma不工作?
原因很明显,这个编写工作的范围和范围,你使用pragma对它没有任何错误,你必须保护透明度与这个pragma,每件事情都将按预期工作.