![](/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.