Como converter sockaddr_storage e evitar violações de regras de alias restritas

Eu estou usando o Guia de Beej para redes e me deparei com um problema de alias. Ele propõe uma função para retornar o endereço IPv4 ou IPv6 de uma determinada estrutura:

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  }

Isso faz com que o GCC grave um erro de aliasessa na linha 3. Pelo que entendi, é porque eu chamo essa função assim:

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

Eu estou supondo que o aliasing tem a ver com o fato de que otheir_addr variável é do tiposockaddr_storage e outro ponteiro de um tipo diferente aponta para a mesma memória.

É a melhor maneira de contornar esse problemasockaddr_storage, sockaddr_inesockaddr_in6 em uma união? Parece que este deve ser um território bem usado em redes, não consigo encontrar bons exemplos com as melhores práticas.

Além disso, se alguém puder explicar exatamente onde o problema de aliasing ocorre, eu agradeceria muito.

questionAnswers(4)

yourAnswerToTheQuestion