2010-04-29 3 views
0

En utilisant boost 1.4.2 asio dans une application c + + et obtenir des avertissements linux compilateur je ne grok pas.boost asio ssl flux socket compilation problème

toujours là?
L'application sur laquelle je travaille a besoin d'une "socket" qui pourrait être une socket ssl ou une socket tcp régulière afin de cacher les spécificités derrière une classe "socket" de template qui prend soit une classe socket ssl soit tcp socket class comme paramètre de modèle - ci-dessous est le code de classe ssl.
L'application fonctionne correctement sans optimisation activée; le problème est quand je compile sous linux g ++ 4.4.1 et activez l'optimisation à -02 ou supérieur, l'indicateur -fstrict-aliasing est activé. Compiler résultats dans les avertissements stricts d'aliasing le long des lignes de: « avertissement: déréférencement pointeur de type punned cassera des règles strictes-aliasing » partout où je déréférencer (poignée de main par exemple _psock->) _psock

Je voudrais savoir pourquoi cet avertissement est émis, et indique t-il un problème de conception ...

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; 
}; 

toute la sortie douloureuse avec la compilation -02 activé, ce qui se traduit par -fstrict-aliasing

../. ./../../third-party/boost/1.42.0/boost/function/function_base.hpp : 321: warning: le pointeur déréférencé de type puni va rompre les règles d'alias strictes ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:325: warning : le pointeur déréférencé par type punira les règles d'alias strictes ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp: Dans la fonction de membre statique 'static void boost :: detail :: fonction :: functor_manager_common :: manage_small (const boost :: détail :: function :: function_buffer &, boost :: detail :: function :: function_buffer &, boost :: detail :: fonction :: functor_manager_operation_type) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>] ': ../../../../third-party/boost/ 1.42.0/boost/function/function_base.hpp: 360: instancié à partir de 'static void boost :: détail :: function :: functor_manager :: manager (const boost :: detail :: fonction :: function_buffer &, boost :: detail :: function :: function_buffer &, boost :: detail :: fonction :: functor_manager_operation_type, mpl _ :: true_) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi: : list1>> *>>>] ' ../../../../third-party/boost/1.42.0/boost/function/function_base.hpp:406: instancié à partir de' static void boost: : detail :: function :: functor_manager :: gestionnaire (const boost :: détail :: function :: function_buffer &, boost :: detail :: fonction :: function_buffer &, boost :: detail :: function :: functor_manager_operation_type, boost: : detail :: function :: function_obj_tag) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>] ' ../../../. ./third-party/boost/1.42.0/boost/function/function_base.hpp:434: instancié à partir de 'static void boost :: détail :: function :: functor_manager :: manage (const boost :: detail :: function: : funct ion_buffer &, boost :: detail :: function :: function_buffer &, boost :: detail :: function :: functor_manager_operation_type) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>] ' ../../../../third-party/boost/1.42.0/boost/function/function_template.hpp:913: instancié à partir de' void boost :: function0 :: assign_to (Functor) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: liste1>> *>>>, R = int] ' ../../../../ third-party/boost/1.42.0/boost/function/function_template.hpp: 722: instancié à partir de 'boost :: function0 :: function0 (Functor, nom de type boost :: enable_if_c :: type) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: liste1>> *>>>, R = int] ' ../../../../third-party/boost/1.42.0/boost/function/function_template.hpp: 1064: instancié à partir de 'boost :: function :: function (Functor, type de fichier boost :: enable_if_c :: type) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: list1>> *>>>, R = int] ' ../../../../third-party/boost/1.42.0/boost/function/function_template.hpp:1105: instancié à partir de' typename boost :: enable_if_c &> :: type boost :: function :: opérateur = (Functor) [avec Functor = boost :: _ bi :: bind_t>>>, boost :: _ bi :: liste1>> *>>>, R = int] ' ../../../../third-party/boost/1.42.0/boost/asio/ssl/detail/openssl_operation.hpp:134: instancié à partir de' boost :: asio :: ssl :: detail :: openssl_operation :: openssl_operation (boost :: asio :: ssl :: détail :: ssl_primitive_func, flux &, boost :: asio :: ssl :: détail :: net_buffer &, SSL *, BIO *) [avec Stream = boost :: asio :: basic_stream_socket>] ' ../../../../third-party/boost/1.42. 0/boost/asio/ssl/détail/openssl_stream_service.hpp: 510: instancié à partir de 'boost :: system :: code_erreur boost :: asio :: ssl :: détail :: openssl_stream_service :: handshake (boost :: asio :: ssl :: detail :: openssl_stream_service :: impl_struct * &, flux &, boost :: asio :: ssl :: flux_base :: type handshake, boost :: system :: code_erreur &) [avec Stream = boost :: asio :: basic_stream_socket> ] ' ../../../../third-party/boost/1.42.0/boost/asio/ssl/stream_service.hpp:100: instancié à partir de' boost :: system :: error_code boost :: asio :: ssl :: stream_service :: poignée de main (boost :: asio :: ssl :: détail :: openssl_stream_service :: impl_struct * &, flux &, boost :: asio :: ssl :: stream_base :: handshake_type, boost :: system :: error_code &) [avec Stream = boost :: asio :: basic_stream_socket>] ' .. /../../../third-party/boost/1.42.0/boost/asio/ssl/stream.hpp:207: instancié à partir de 'boost :: system :: error_code boost :: asio :: ssl: : stream :: handshake (boost :: asio :: ssl :: flux_base :: handshake_type, boost :: system :: code_erreur &) [avec Stream = boost :: asio :: basic_stream_socket>, Service = boost :: asio :: ssl :: stream_service] » ../sockets/socket_ssl_cli.h:45: instancié d'ici

Répondre

1

lire le wiki de boost expliquant les lignes directrices d'avertissement du compilateur

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

ils ont une section entière dédiée à - fstrict-aliasing

-fstrict-aliasing - également activé par -O2, -O3 et -Os. Indique au compilateur qu'il est acceptable de faire une certaine classe d'optimisation en fonction du type d'expressions. En particulier, vous promettez en utilisant ce drapeau qu'un objet d'un type ne résidera pas à la même adresse en tant qu'objet d'un type incompatible. -fno-strict-aliasing - désactive cette optimisation. Si cela modifie le comportement de votre code, vous avez un problème dans votre code. Cela essaie de vous faire savoir que vous demandez au compilateur de faire un comportement indéfini et il ne peut pas faire ce que vous pensez qu'il va faire. Au fur et à mesure que le niveau d'optimisation augmente, la probabilité que vous n'aimiez pas ce qu'il fait va augmenter. Je montre un exemple simple plus tard qui génère de façon surprenante le mauvais résultat lorsque l'optimisation à tout niveau est activée. Ignorez cet avertissement à vos risques et périls. Il est peu probable que vous vous souciez du comportement indéfini qui en résulte.

0

J'ai un problème similaire avec gcc-4.4.4 (Debian Squeeze). Je suis passé par une liste de diffusion Boost thread liée à cela. Cependant, à la fin, je suis toujours confus quant à qui est le problème. Que ce soit GCC ou Boost. : -S J'ai recouru à -fno-strict-aliasing dans mon code.

Questions connexes