2017-02-15 3 views
2

Enthält das folgende Codeelement ein Undefined Behavior? Der Code versucht nur sockaddr_storage Struktur mit sockaddr_in Strukturformat zu füllen und dann über denselben Typ zurück zu lesen, dh. sockaddr_in. Auch in den folgenden Aufrufen wird die sockaddr_storage Struktur mit einer Besetzung an sockaddr Struktur übergeben. Ich sah ähnliche Frage und frage mich, ob dieser Code es auch enthält. Dieses Programm funktioniert gut, wo immer ich habe es ausprobiert -UB mit Struktur Gießen von verschiedenen Arten?

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

Das Ergebnis kommt: 10000 true die absolut korrekt ist!

+0

entfernt Fehlerbehandlung für die Aufrechterhaltung es klein .. –

+0

Ähnliche: http://StackOverflow.com/Questions/9964418/Strict-Aliasing-and-Ausrichtung –

Antwort

3

Der Code ist korrekt. Hier ist, was die Open Group sagt über sockaddr_storage:

Der <sys/socket.h> Kopf die sockaddr_storage Struktur bestimmt wird. Diese Struktur sind:

  • Groß genug, um alle unterstützten protokollspezifische Adresse Strukturen

  • an einer geeigneten Grenze ausgerichtet aufzunehmen, so dass Zeiger auf sie kann als Zeiger auf protokollspezifische gegossen werden Adressstrukturen und verwendet die Felder dieser Strukturen zugreifen, ohne Ausrichtungsprobleme

+2

"Es ist korrekt" - meinst du es ist UB oder der Code ist korrekt und es ist nicht UB? Siehe auch https://stackoverflow.com/questions/42178179/will-casting-around-sockaddr-storage-and-sockaddr-in-break-strict-aliasing – harmic

+1

Das ist falsch, siehe auch - http://StackOverflow.com/questions/42176962/fill-sockaddr-storage-struct-mit-werten-von-sockaddr-in –

Verwandte Themen