C,Unix域套接字,辅助数据和GCC;使用CMSG_DATA宏

时间:2010-02-09 20:12:04

标签: c unix sockets gcc

我该怎么做:

*(int *)CMSG_DATA(hdr) = fd2pass;

没有GCC提出这个:

error: dereferencing type-punned pointer will break strict-aliasing rules

以与这些选项兼容的方式:

-Wall -Werror -pedantic

2 个答案:

答案 0 :(得分:6)

除非出现问题,否则没有实际的别名 - *(int *)引用的对象CMSG_DATA(hdr)不是hdr的别名 - 它已经过了hdr的末尾。警告不正确。

您可以使用memcpy解决这个问题:

memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int));

不要使用-fno-strict-aliasing:禁用假定严格别名的优化;它可能会产生相当糟糕的代码。

有关技术详情,请参阅glibc bug 16197

答案 1 :(得分:-2)

尝试将 -fno-strict-aliasing 传递给gcc。

要了解严格别名主题,请查看此question