2011-03-28 58 views
1

我开始使用boost的序列化代码将数据写入二进制流。我收到以下可能被禁用的警告(D_SCL_SECURE_NO_WARNINGS),但我不知道这样做是否安全?我怎样才能得到更具体的信息哪些代码导致警告?我只知道.cpp文件。Boost序列化:安全地忽略警告?

这是从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>  ] 

谢谢!

+0

什么是所有4S? – 2011-03-28 10:07:30

+0

这是来自VS输出。我在我的解决方案中有几个项目,它是编译项目4的输出。(并行编译很有帮助) – Philipp 2011-03-28 10:13:18

回答

2

如果您信任Boost不会超出范围参数,则可以禁用警告。

微软已经提出了一套C库新的“更安全”的功能,

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1225.pdf

,并警告大家谁使用旧的。

你也许也可以尝试一个更新的Boost库?介绍最新的1.46.1

+0

除了编译器所抱怨的功能不是C,而是C++,并且它非常安全(或至少和使用char *的东西一样安全)。 – 2011-03-28 11:20:59

0

如果你的项目是要使用Visual Studio可以在_Sgetn_s更换呼叫sgetn(从预警线)和复制初始的最后一个参数只编译呼叫。这样你就可以把呼叫转换成安全的呼叫。

或者你可以通过下面提供的补丁去,它适用_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 
0

Boost文档承认有许多警告是安全忽略的。我删除从加入我在Visual Studio 2008控制台刺激性警告消息下面我的代码:

#pragma warning(disable:4099)