Cómo lanzar sockaddr_storage y evitar romper reglas de alias estrictas

Estoy usando la Guía de redes de Beej y me encontré con un problema de aliasing. Propone una función para devolver la dirección IPv4 o IPv6 de una estructura particular:

1  void *get_in_addr( struct sockaddr *sa )
2  {
3      if (sa->sa_family == AF_INET)
4        return &(((struct sockaddr_in*)sa)->sin_addr);
5      else
6        return &(((struct sockaddr_in6*)sa)->sin6_addr);
7  }

Esto hace que GCC emita un error de aliasing estricto parasa en la línea 3. Como lo entiendo, es porque llamo a esta función así:

struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
          get_in_addr((struct sockaddr *)&their_addr),
          connection_name,
          sizeof connection_name);

Supongo que el alias tiene que ver con el hecho de que eltheir_addr la variable es de tiposockaddr_storage y otro puntero de un tipo diferente apunta a la misma memoria.

Es la mejor manera de sortear esta adherencia.sockaddr_storage, sockaddr_inysockaddr_in6 en una union? Parece que este debe ser un territorio muy usado en la red, simplemente no puedo encontrar ningún buen ejemplo con las mejores prácticas.

Además, si alguien puede explicar exactamente dónde se produce el problema del alias, lo apreciaría mucho.

Respuestas a la pregunta(4)

Su respuesta a la pregunta