【发布时间】:2009-09-15 21:10:40
【问题描述】:
我正在使用 Beej 的网络指南并遇到了别名问题。他提出了一个函数来返回特定结构的 IPv4 或 IPv6 地址:
1 void *get_in_addr( struct sockaddr *sa )
2 {
3 if (sa->sa_family == AF_INET)
4 return &(((struct sockaddr_in*)sa)->sin_addr);
5 else
6 return &(((struct sockaddr_in6*)sa)->sin6_addr);
7 }
这会导致 GCC 在第 3 行为 sa 吐出严格别名错误。据我了解,这是因为我这样调用此函数:
struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
connection_name,
sizeof connection_name);
我猜测别名与their_addr 变量的类型为sockaddr_storage 而另一个不同类型的指针指向同一个内存这一事实有关。
将sockaddr_storage、sockaddr_in 和sockaddr_in6 加入工会的最佳方法是什么?看起来这在网络中应该是一个很好的领域,我只是找不到任何具有最佳实践的好例子。
另外,如果有人能准确解释混叠问题发生的位置,我将不胜感激。
【问题讨论】:
-
您可以将
get_in_addr()更改为struct sockaddr_storage *并忘记通话中的演员吗? -
谢谢你,mark4o!我不知道为什么我让这变得比它需要的更难。你的建议很有效。
-
@mark4o 那岂不是将问题转移到
get_in_addr的第4行和第6行?
标签: c sockets pointer-aliasing strict-aliasing