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?
#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!
entfernt Fehlerbehandlung für die Aufrechterhaltung es klein .. –
Ähnliche: http://StackOverflow.com/Questions/9964418/Strict-Aliasing-and-Ausrichtung –