Tag: sockaddr in

如何在不违反严格别名规则的情况下合法地使用类型惩罚与联合在struct sockaddr的变体之间进行投射?

POSIX打算将struct sockaddr变量指针转换为可转换的,但是根据C标准的解释,这可能违反了严格的别名规则,因此违反了UB。 (请参阅下面的评论这个答案 。)我至少可以确认gcc可能至少存在问题:此代码打印Bug! 启用优化,并且Yay! 禁用优化: #include #include #include sa_family_t test(struct sockaddr *a, struct sockaddr_in *b) { a->sa_family = AF_UNSPEC; b->sin_family = AF_INET; return a->sa_family; // AF_INET please! } int main(void) { struct sockaddr addr; sa_family_t x = test(&addr, (struct sockaddr_in*)&addr); if(x == AF_INET) printf(“Yay!\n”); else if(x == AF_UNSPEC) printf(“Bug!\n”); return 0; } 在联机IDE上观察此行为。 要解决此问题, […]