Повысить сериализацию: безопасно игнорировать предупреждение? - PullRequest
1 голос
/ 28 марта 2011

Я начал использовать код сериализации boost для записи данных в двоичный поток. Я получаю следующие предупреждения, которые можно отключить (D_SCL_SECURE_NO_WARNINGS), но мне интересно, безопасно ли это делать? Как я могу получить более конкретную информацию, какой мой код вызывает предупреждение? Я знаю только файл .cpp.

Это выходные данные Visual Studio 2008:

4>g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(162) : warng C4996: 'std::basic_streambuf<_Elem,_Traits>::sgetn': 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'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        E:\Visual Studio 9.0\VC\include\streambuf(121) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::sgetn'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(152) : while compiling class template member function 'void boost::archive::basic_binary_iprimitive<Archive,Elem,Tr>::load_binary(void *,size_t)'
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(107) : see reference to function template instantiation 'void boost::archive::basic_binary_iprimitive<Archive,Elem,Tr>::load<T>(T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(356) : see reference to function template instantiation 'void boost::archive::load_access::load_primitive<Archive,T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(433) : see reference to function template instantiation 'void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke<T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(580) : see reference to function template instantiation 'void boost::archive::detail::load_non_pointer_type<Archive>::invoke<T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/common_iarchive.hpp(68) : see reference to function template instantiation 'void boost::archive::load<Archive,T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(67) : see reference to function template instantiation 'void boost::archive::detail::common_iarchive<Archive>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive_impl.hpp(50) : see reference to function template instantiation 'void boost::archive::basic_binary_iarchive<Archive>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/interface_iarchive.hpp(61) : see reference to function template instantiation 'void boost::archive::binary_iarchive_impl<Archive,Elem,Tr>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(77) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_iarchive<Archive>::operator >><unsigned char>(T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(74) : while compiling class template member function 'void boost::archive::basic_binary_iarchive<Archive>::load_override(boost::archive::version_type &,int)'
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive_impl.hpp(36) : see reference to class template instantiation 'boost::archive::basic_binary_iarchive<Archive>' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive.hpp(42) : see reference to class template instantiation 'boost::archive::binary_iarchive_impl<Archive,Elem,Tr>' being compiled
4>        with
4>        [
4>            Archive=boost::archive::naked_binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>
4>        ]
4>g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(176) : warning C4996: 'std::basic_streambuf<_Elem,_Traits>::sgetn': 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'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        E:\Visual Studio 9.0\VC\include\streambuf(121) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::sgetn'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(162) : warning C4996: 'std::basic_streambuf<_Elem,_Traits>::sgetn': 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'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        E:\Visual Studio 9.0\VC\include\streambuf(121) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::sgetn'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(152) : while compiling class template member function 'void boost::archive::basic_binary_iprimitive<Archive,Elem,Tr>::load_binary(void *,size_t)'
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(107) : see reference to function template instantiation 'void boost::archive::basic_binary_iprimitive<Archive,Elem,Tr>::load<T>(T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(356) : see reference to function template instantiation 'void boost::archive::load_access::load_primitive<Archive,T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(433) : see reference to function template instantiation 'void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke<T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/iserializer.hpp(580) : see reference to function template instantiation 'void boost::archive::detail::load_non_pointer_type<Archive>::invoke<T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/common_iarchive.hpp(68) : see reference to function template instantiation 'void boost::archive::load<Archive,T>(Archive &,T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(67) : see reference to function template instantiation 'void boost::archive::detail::common_iarchive<Archive>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive_impl.hpp(50) : see reference to function template instantiation 'void boost::archive::basic_binary_iarchive<Archive>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/detail/interface_iarchive.hpp(61) : see reference to function template instantiation 'void boost::archive::binary_iarchive_impl<Archive,Elem,Tr>::load_override<T>(T &,int)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(77) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_iarchive<Archive>::operator >><unsigned char>(T &)' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            T=unsigned char
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/basic_binary_iarchive.hpp(74) : while compiling class template member function 'void boost::archive::basic_binary_iarchive<Archive>::load_override(boost::archive::version_type &,int)'
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive_impl.hpp(36) : see reference to class template instantiation 'boost::archive::basic_binary_iarchive<Archive>' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive
4>        ]
4>        g:\winlib\boost\1_42_0\boost/archive/binary_iarchive.hpp(76) : see reference to class template instantiation 'boost::archive::binary_iarchive_impl<Archive,Elem,Tr>' being compiled
4>        with
4>        [
4>            Archive=boost::archive::binary_iarchive,
4>            Elem=char,
4>            Tr=std::char_traits<char>
4>        ]
4>g:\winlib\boost\1_42_0\boost/archive/basic_binary_iprimitive.hpp(176) : warning C4996: 'std::basic_streambuf<_Elem,_Traits>::sgetn': 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'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]
4>        E:\Visual Studio 9.0\VC\include\streambuf(121) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::sgetn'
4>        with
4>        [
4>            _Elem=char,
4>            _Traits=std::char_traits<char>
4>        ]

Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

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

Microsoft предложила набор новых «более безопасных» функций для библиотеки C,

http://www.open -std.org / ОТК1 / SC22 / WG14 / WWW / Docs / n1225.pdf

и предупреждают всех, кто пользуется старыми.

Возможно, вы также можете попробовать более новую библиотеку Boost? Последний 1.46.1

0 голосов
/ 17 декабря 2011

Повышение документации признает, что есть много предупреждений, которые безопасно игнорировать. Я удалил раздражающие предупреждающие сообщения из своей консоли в Visual Studio 2008, добавив в свой код следующее:

#pragma warning(disable:4099)
0 голосов
/ 11 августа 2011

Если ваш проект будет компилироваться только с использованием Visual Studio, вы можете заменить вызов на sgetn (из строки предупреждения) на _Sgetn_s ипродублируйте последний параметр начального вызова.Таким образом, вы преобразуете вызов в безопасный.

Или вы можете использовать патч, указанный ниже, он применяется _Sgetn_s для VC 8.0 и выше, но оставляет sgetn для всех остальных компиляторов.

Index: basic_binary_iprimitive.hpp
===================================================================

@@ -143,6 +143,11 @@
     void
     load_binary(void *address, std::size_t count);
 };
+#if defined(_MSC_VER) && (_MSC_VER >= 1400) //VC 8.0 +
+#   define BOOST_sgetn_safe( buf, count ) _Sgetn_s( buf, count, count )
+#else 
+#   define BOOST_sgetn_safe( buf, count ) sgetn( buf, count )
+#endif

 template<class Archive, class Elem, class Tr>
 inline void
@@ -157,6 +162,7 @@
     );
     std::streamsize s = static_cast<std::streamsize>(count / sizeof(Elem));
-    std::streamsize scount = m_sb.sgetn(
+    std::streamsize scount = m_sb.BOOST_sgetn_safe(
         static_cast<Elem *>(address), 
         s
     );
@@ -173,7 +179,7 @@
 //                archive_exception(archive_exception::stream_error)
 //        );
         Elem t;
-        scount = m_sb.sgetn(& t, 1);
+        scount = m_sb.BOOST_sgetn_safe(& t, 1);
         if(scount != 1)
             boost::serialization::throw_exception(
                 archive_exception(archive_exception::input_stream_error)
@@ -181,6 +187,7 @@
         std::memcpy(static_cast<char*>(address) + (count - s), &t, s);
     }
 }
+#undef BOOST_sgetn_safe

 } // namespace archive
 } // namespace boost
...