xutility (2227): предупреждение C4996: ‘std :: _ Copy_impl’

Я получил это предупреждающее сообщение .. но я не знаю, в чем / где проблема ..!

включает в себя

#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 *,6,8>>,76>
1>          ]

код появляется в строке 257, как говорится в предупреждении. но я не могу это исправить, потому что я не знаю, что не так ..

Строковые данные содержат строку «user: password» для базовой аутентификации через 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 *,
6,
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)

кто-нибудь есть идеи?

12

Решение

Я думаю, вы знаете, в чем смысл предупреждения, но сначала я опишу предупреждение, а затем скажу, что нужно сделать, чтобы избавиться от него. 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 отключить это предупреждение (как и вы), но почему прагма не работает?

причина очевидна, эта прагма работает над областью действия и область, в которой вы используете прагму, не имеет ничего плохого, вы должны следить xutility с этой прагмой и все будет работать как положено.

12

Другие решения

Других решений пока нет …