![](/img/trans.png)
[英]How to get native socket file describer from boost::asio::ssl::stream<boost::asio::ip::tcp::socket>?
[英]boost asio ssl stream socket compilation issue
在c ++应用程序中使用boost 1.4.2 asio并获得linux编译器警告,我不理解。
还在?
我正在使用的应用程序需要一个“套接字”,它可能是ssl套接字或常规的tcp套接字,因此我们将细节隐藏在采用ssl套接字类或tcp套接字类作为模板参数的模板“ socket”类后面-是ssl类代码。
该应用程序可以正常运行,而无需进行任何优化; 问题是当我在linux g ++ 4.4.1下编译并在-02或更高版本上打开优化时,-fstrict-aliasing标志打开。 编译会导致严格的混叠警告,如下所示:“警告:取消引用类型化指针将破坏严格混叠规则”在我取消引用_psock的任何地方(例如_psock-> handshake)
我想知道为什么会发出此警告,它是否指示设计问题?
class socket_ssl_cli
{
public:
typedef ba::ssl::stream<ba::ip::tcp::socket> socket_type;
socket_ssl_cli(ba::io_service& io_svc, SocketConfig & sockcfg)
: _io_svc(io_svc)
, _ctxt(_io_svc, ba::ssl::context::tlsv1)
, _psock(0)
{
try {
// the one and only ssl context
// hardcoded for test, but get these values from config
_ctxt.set_options(ba::ssl::context::default_workarounds |
ba::ssl::context::verify_none);
_psock = new socket_type(_io_svc, _ctxt);
} catch (bs::system_error & x) {
throw std::runtime_error(x.code().message());
}
}
~socket_ssl_cli()
{
if (_psock) {
bs::error_code ec;
close_socket(ec);
delete _psock;
}
}
socket_type & raw_socket() { return *_psock; }
void setup(bs::error_code & ec)
{
_psock->handshake(ba::ssl::stream_base::client, ec);
}
void close_socket(bs::error_code & ec)
{
// shut down ssl, then shutdown socket, then close socket
_psock->shutdown(ec);
_psock->lowest_layer().shutdown(ba::socket_base::shutdown_both, ec);
_psock->lowest_layer().close(ec);
}
private:
ba::io_service & _io_svc;
ba::ssl::context _ctxt;
socket_type * _psock;
};
打开-02时所有痛苦的编译输出,这导致-fstrict-aliasing
../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:321:警告:取消引用类型标记的指针将破坏严格的别名规则../ .. /../../third-party/boost/1.42.0/boost/function/function_base.hpp:325:警告:取消引用类型标记的指针将破坏严格的混叠规则../../../。 ./third-party/boost/1.42.0/boost/function/function_base.hpp:在静态成员函数'static void boost :: detail :: function :: functor_manager_common :: manage_small(const boost :: detail :: function: :function_buffer&,boost :: detail :: function :: function_buffer&,boost :: detail :: function :: functor_manager_operation_type)[with Functor = boost :: _ bi :: bind_t>>>,boost :: __ bi :: list1>> * >>>]':../../../../ third-party / boost / 1.42.0 / boost / function / function_base.hpp:360:从“静态void boost :: detail :: function实例化:: functor_manager :: manager(const boost :: detail :: function :: function_buffer&,boost :: detail :: function :: function_buffer&,boost :: detail :: function :: functor_manager_operation_type, mpl _ :: true_)[with Functor = boost :: _ bi :: bind_t>>>,boost :: _ bi :: list1>> *>>>]''../../../../third-party /boost/1.42.0/boost/function/function_base.hpp:406:从'static void boost :: detail :: function :: functor_manager :: manager(const boost :: detail :: function :: function_buffer&,boost:实例化:detail :: function :: function_buffer&,boost :: detail :: function :: functor_manager_operation_type,boost :: detail :: function :: function_obj_tag)[with Functor = boost :: _ bi :: bind_t>>>,boost :: __ bi :: list1>> *>>>]'../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:434:从'static void boosting实例化: :detail :: function :: functor_manager :: manage(const boost :: detail :: function :: function_buffer&,boost :: detail :: function :: function_buffer&,boost :: detail :: function :: functor_manager_operation_type)[with Functor = boost :: _ bi :: bind_t>>>,boost :: _ bi :: list1>> *>>>]'../../../../third-party/boost/1.42.0/boost/ function / function_template.hpp:913:从'void boost :: function实例化 0 :: assign_to(Functor)[使用Functor = boost :: _ bi :: bind_t>>>,boost :: _ bi :: list1>> *>>>,R = int]'../../../ ../third-party/boost/1.42.0/boost/function/function_template.hpp:722:从'boost :: function0 :: function0(Functor,typename boost :: enable_if_c :: type)实例化[带有Functor = boost :: _ bi :: bind_t>>>,boost :: _ bi :: list1>> *>>>,R = int]'../../../../third-party/boost/1.42.0 /boost/function/function_template.hpp:1064:从'boost :: function :: function(Functor,typename boost :: enable_if_c :: type)实例化[with Functor = boost :: _ bi :: bind_t>>>,boost: :_bi :: list1>> *>>>,R = int]'../../../../third-party/boost/1.42.0/boost/function/function_template.hpp:1105:实例化从'typename boost :: enable_if_c&> :: type boost :: function :: operator =(Functor)[与Functor = boost :: _ bi :: bind_t>>>,boost :: __ bi :: list1>> *>>>> ,R = int]'../../../../third-party/boost/1.42.0/boost/asio/ssl/detail/openssl_operation.hpp:134:从'boost :: asio:实例化: :ssl :: detail :: openssl_opera tion :: openssl_operation(boost :: asio :: ssl :: detail :: ssl_primitive_func,Stream&,boost :: asio :: ssl :: detail :: net_buffer&,SSL *,BIO *)[with Stream = boost :: asio: :basic_stream_socket>]'../../../../third-party/boost/1.42.0/boost/asio/ssl/detail/openssl_stream_service.hpp:510:从'boost :: system ::实例化error_code boost :: asio :: ssl :: detail :: openssl_stream_service :: handshake(boost :: asio :: ssl :: detail :: openssl_stream_service :: impl_struct *&,Stream&,boost :: asio :: ssl :: stream_base: :handshake_type,boost :: system :: error_code&)[with Stream = boost :: asio :: basic_stream_socket>]'../../../../third-party/boost/1.42.0/boost/asio /ssl/stream_service.hpp:100:从'boost :: system :: error_code boost :: asio :: ssl :: stream_service :: handshake(boost :: asio :: ssl :: detail :: openssl_stream_service :: impl_struct *实例化&,Stream&,boost :: asio :: ssl :: stream_base :: handshake_type,boost :: system :: error_code&)[with Stream = boost :: asio :: basic_stream_socket>]'../../../.。 ./third-party/boost/1.42.0/boost/asio/ssl/str eam.hpp:207:从'boost :: system :: error_code boost :: asio :: ssl :: stream :: handshake实例化(boost :: asio :: ssl :: stream_base :: handshake_type,boost :: system :: error_code&)[使用Stream = boost :: asio :: basic_stream_socket>,Service = boost :: asio :: ssl :: stream_service]'../sockets/socket_ssl_cli.h:45:从此处实例化
阅读boost Wiki,解释编译器警告准则
https://svn.boost.org/trac/boost/wiki/Guidelines/WarningsGuidelines
他们有一整节专门介绍-fstrict-aliasing
-fstrict-aliasing-也由-O2,-O3和-Os打开。 告诉编译器可以根据表达式的类型进行某种优化。 特别是,通过使用此标志,您可以保证一种类型的对象不会与不兼容类型的对象位于相同的地址。 -fno-strict-aliasing-关闭此优化。 如果这改变了代码的行为,则说明您的代码有问题。
这试图让您知道您正在要求编译器执行未定义的行为,并且它可能未执行您认为会做的事情。 随着优化级别的提高,您可能不喜欢的功能也会增加。 稍后我将展示一个简单的示例,该示例在打开任何级别的优化时都会令人惊讶地生成错误的结果。 忽略此警告后果自负。 您不太可能会关心由此导致的未定义行为。
我在gcc-4.4.4(Debian Squeeze)中遇到类似的问题。 我经历了与此相关的Boost邮件列表线程 。 但是,最后我还是对谁是问题感到困惑。 无论是GCC还是Boost的。 :-S我在代码中求助于-fno-strict-aliasing。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.