ускорить компиляцию потокового сокета ASIO ASIO - PullRequest
0 голосов
/ 29 апреля 2010

Использование boost 1.4.2 asio в приложении c ++ и получение предупреждений компилятора Linux, которые я не получаю.

все еще здесь?
Приложение, над которым я работаю, нуждается в "сокете", который может быть сокетом ssl или обычным сокетом tcp, поэтому мы скрываем особенности за шаблоном класса «сокет», который принимает либо класс сокета ssl или класс сокета tcp в качестве параметра шаблона - ниже приведен код класса ssl.
Приложение работает правильно без какой-либо оптимизации; проблема, когда я компилирую под Linux G ++ 4.4.1 и включите оптимизацию при -02 или выше, флаг -fstrict-aliasing включен. Компиляция результатов в строгих предупреждениях о псевдонимах в соответствии с: msgstr "предупреждение: разыменование указателя типа-наказание нарушит правила строгого наложения" везде разыменование _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-aliasing

.. / .. / .. / .. / сторонний / 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) [с Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>] ': ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:360: создается из 'статического повышения void :: 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_) [с помощью Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>] ' ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:406: создается из 'статического повышения void :: 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) [с помощью 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 :: function_buffer &, boost :: detail :: function :: function_buffer &, boost :: detail :: function :: functor_manager_operation_type) [с 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] ' ../../../../third-party/boost/1.42.0/boost/function/function_template.hpp:722: создается из 'boost :: function0 :: function0 (Functor, типовое повышение :: 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) [с 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_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 :: 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/stream.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: : :: stream_service SSL] ../sockets/socket_ssl_cli.h:45: создается здесь

Ответы [ 2 ]

1 голос
/ 04 июня 2010

прочитайте вики-версию Boost, объясняющую рекомендации по предупреждению компилятора

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

у них есть целый раздел, посвященный -fstrict-aliasing

-fstrict-aliasing - также включается -O2, -O3 и -Os. Сообщает компилятору, что можно выполнить определенный класс оптимизации в зависимости от типа выражений. В частности, вы обещаете с помощью этого флага, что объект одного типа не будет находиться по тому же адресу, что и объект несовместимого типа. -fno-strict-aliasing - отключает эту оптимизацию. Если это изменит поведение вашего кода, у вас есть проблема в вашем коде.

Это попытка сообщить вам, что вы просите компилятор вести неопределенное поведение, и он может не делать то, что, как вы думаете, он сделает. По мере повышения уровня оптимизации вероятность того, что вам не понравится то, что он делает, увеличится. Позже я покажу простой пример, который неожиданно дает неверный результат, когда оптимизация на любом уровне включена. Игнорируйте это предупреждение на свой страх и риск. Вы вряд ли будете заботиться о неопределенном поведении, которое в результате.

0 голосов
/ 09 июня 2010

У меня похожая проблема с gcc-4.4.4 (Debian Squeeze). Я просмотрел список рассылки Boost thread , связанный с этим. Однако, в конце концов, я все еще не понимаю, чья это проблема. Будь то GCC или Boost. : -S Я прибегнул к -fno-strict-aliasing в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...