2010-04-29 127 views
0

在C++應用程序中使用boost 1.4.2 asio並得到linux編譯器警告我不喜歡。boost asio ssl流套接字編譯問題

還在嗎?
我正在處理的應用程序需要一個可能是ssl套接字或常規tcp套接字的「套接字」,因此我們在模板「套接字」類後面隱藏了具體的 ,該套接字可以使用ssl套接字類或 tcp套接字類作爲模板參數 - 下面是ssl類代碼。
該應用程序無需打開任何優化即可正常運行;問題是當我在linux g ++ 4.4.1 下編譯並打開-02或更高優化時,-fstrict-aliasing標誌打開。 編譯導致沿線的嚴格別名警告: 「警告:提領型punned指針將打破嚴格走樣規則」 無處不在我取_psock(如_psock->握手)

我想知道爲什麼這個警告被髮出,並且它表明一個設計問題...

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走樣

../。 ./../../third-party/boost/1.42.0/boost/function/function_base.hpp :321:警告:取消引用類型指針會打破嚴格別名規則 ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:325:warning :解引用類型指針會破壞嚴格別名規則 ../../../../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:從'static void boost :: detail :: function :: functor_manager :: manager(const boost :: detail :: function :: function_buffer 01 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 boost :: detail :: function :: functor_manager :: manage(const boost :: detail :: function: :本功能ion_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 :: function0 :: assign_to'實例化(Functor)[with Functor = boost :: _ bi :: bind_t> >>,boost :: _ bi :: list1 >> * >> >>,R = int]' ../../../../第三方/ boost/1.42.0/boost/function/function_template.hpp:722:從'boost :: function0 :: function0(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_template。hpp:1064:從'boost :: function :: function(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:1105:從'typename boost :: enable_if_c &> :: type boost :: function :: operator =(Functor)[with 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 ::詳細信息:: openssl_operation :: openssl_operation(boost :: asio :: ssl :: detail :: ssl_primitive_func,Stream &,boost :: asio :: ssl :: detail :: net_buffer &,SSL *,BIO *)[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 :: instantiated':: 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/stream.hpp:207:從'boost :: system :: error_code boost :: asio :: ssl: :stream :: handshake(boost :: asio :: ssl :: stream_base :: handshake_type,boost :: system :: error_code &)[with Stream = boost :: asio :: basic_stream_socket>,Service = boost :: asio :: SSL :: stream_service]」 ../sockets/socket_ssl_cli.h:45:從這裏

回答

1

實例化閱讀升壓維基解釋編譯器警告準則

https://svn.boost.org/trac/boost/wiki/Guidelines/WarningsGuidelines

他們有一整個章節專門爲 - fstrict-aliasing

-fstrict-aliasing - 也由-O2,-O3和-Os啓用。告訴編譯器可以根據表達式的類型進行某種優化。特別是通過使用此標誌,您有希望使一種類型的對象不會與不兼容類型的對象位於同一地址。 -fno-strict-aliasing - 關閉此優化。如果這改變了你的代碼的行爲,你的代碼有問題。

這是試圖讓你知道你要求編譯器做未定義的行爲,它可能不會做你認爲它會做的事。隨着優化級別的提高,你不喜歡它的可能性會增加。稍後我會演示一個簡單的例子,它會在開啓任何級別的優化時出乎意料地產生錯誤的結果。自己的危險忽略這個警告。你不太可能關心未定義的行爲。

0

我遇到了類似gcc-4.4.4(Debian Squeeze)的問題。我經歷了一個與此相關的Boost郵件列表thread。然而,最後我仍然對它的問題感到困惑。無論是GCC還是Boost的。 :-S我在我的代碼中使用了-fno-strict-aliasing。