2 lihuinan lihuinan 于 2017.08.28 15:38 提问

为什么glibc2.23要修改struct sockaddr_storage?

glibc在2.23版本有一个修改https://patchwork.sourceware.org/patch/12453/.
在我的Cotex A7上试验:
修改前:

 struct sockaddr_in6
{
sin6_family;   //0th byte
sin6_port;     //2nd byte
sin6_flowinfo; //4th byte
sin6_addr;     //8th byte
...
};

struct sockaddr_storage
{
ss_family;    //0th byte
__ss_align;   //4th byte
__ss_padding; //8th byte
};

修改后:

 struct sockaddr_storage
{
ss_family;    //0th byte
__ss_padding; //2nd byte
__ss_align;   //124th byte
};

这次合入把sockaddr__storage结构中的__ss_align和__ss_padding交换了位置。
这样会导致以前常用的下列类型强转的用法出现问题:_

  struct sockaddr_storage prefix_addr
 (struct sockaddr_in6 *)&(prefix_addr)->sin6_addr.s6_addr 

请问有没有人能看出glibc这个修改是什么用意?
我上述的强转用法是否本身就不规范(虽然glibc2.23之前一直运行稳定)。

Csdn user default icon
上传中...
上传图片
插入图片