2017-02-15 1 views
2

Le code suivant contient-il un comportement indéfini? Le code tente seulement de remplir la structure sockaddr_storage avec le format de structure sockaddr_in et de le relire par le même type ie. sockaddr_in. Également dans les appels suivants, cette structure sockaddr_storage est transmise avec une structure cast à sockaddr. J'ai vu une question similaire et je me demandais si ce code le contient aussi. Ce programme fonctionne très bien partout où je l'ai testé -UB avec la coulée de structure de différents types?

Run Online

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <iostream> 

using namespace std; 

void fillAF_INET(sockaddr_storage &s){ 
    sockaddr_in *p = reinterpret_cast<sockaddr_in *>(&s); 
    p->sin_family = AF_INET; 
    p->sin_port = htons(10000); 
    inet_pton(AF_INET, "127.0.0.1", &p->sin_addr); 
} 

// void fillAF_INET6(sockaddr_storage &s){...} 
// void fillAF_UNIX(sockaddr_storage &s){...} 

int main(){ 
    sockaddr_storage s; 
    fillAF_INET(s); 

    sockaddr_in *p = reinterpret_cast<sockaddr_in *>(&s); 
    std::cout << ntohs(p->sin_port) << " "; 
    std::cout << boolalpha << (p->sin_family == AF_INET); 

    int sock = socket(AF_INET, SOCK_STREAM,0); 
    int r = bind(sock, (sockaddr *)&s, sizeof(s)); 
    // further calls 

    return 0; 
} 

Le résultat est le fruit: 10000 true qui est tout à fait correct!

+0

gestion des erreurs pour le garder enlevé petit .. –

+0

similaires: http://stackoverflow.com/questions/9964418/strict-aliasing-and-alignment –

Répondre

3

Le code est correct. Voici ce que l'Open Group dit à propos sockaddr_storage:

L'en-tête <sys/socket.h> définit la structure sockaddr_storage. Cette structure est:

  • assez grand pour accueillir toutes les adresses spécifiques au protocole pris en charge structures

  • Aligné à une limite appropriée pour que des pointeurs vers elle peut être jeté comme des pointeurs vers spécifiques au protocole structures d'adresse et utilisé pour accéder les champs de ces structures sans problèmes d'alignement

+2

« Il est correct » - voulez-vous dire qu'il est UB ou le code est correct et ce n'est pas UB? Voir aussi https://stackoverflow.com/questions/42178179/will-casting-around-sockaddr-storage-and-sockaddr-in-break-strict-aliasing – harmic

+1

Ceci est faux, voir aussi - http://stackoverflow.com/questions/42176962/remplissage-sockaddr-stockage-struct-avec-valeurs-de-sockaddr-in –