Имеет ли следующий фрагмент кода неопределенное поведение? Код только пытается заполнить структуру sockaddr_storage
с форматным форматом sockaddr_in
, а затем прочитать его обратно через тот же тип, то есть. sockaddr_in
. Также в следующих вызовах структура sockaddr_storage
передается с литой до sockaddr
структурой. Я видел подобный вопрос и задавался вопросом, содержит ли этот код этот код. Эта программа отлично работает везде, где я тестировал -UB с литой конструкцией различных типов?
#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;
}
Результат приходит: 10000 true
, абсолютно правильно!
удаленная обработка ошибок для ее хранения .. –
похоже: http://stackoverflow.com/questions/9964418/strict-aliasing-and-alignment –