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

6 c unix sockets gcc

我怎样才能做到这一点:

*(int *)CMSG_DATA(hdr) = fd2pass;
Run Code Online (Sandbox Code Playgroud)

没有GCC提出这个:

error: dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)

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

-Wall -Werror -pedantic
Run Code Online (Sandbox Code Playgroud)

And*_*ski 6

除非出现非常错误,否则不会发生实际的别名 - *(int*)引用的对象CMSG_DATA(hdr)不是hdr的别名 - 它已超过hdr的末尾.警告不正确.

你可以用memcpy解决它:

memcpy(CMSG_DATA(hdr), &fd2pass, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

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

有关技术细节,请参阅glibc bug 16197.


Gon*_*alo -2

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

要阐明严格别名主题,请检查此问题

  • 禁用功能来绕过编译器警告通常是一个坏主意。最好理解警告并修改您的代码。当你只是在编译行上加上 -fno-strict-aliasing 时,你就说编译器是错误的。一般来说,最好假设您的代码有问题。话虽这么说,我所见过的通过域套接字传递文件描述符的每个代码示例都是使用原始问题中的取消引用方案编写的。GCC 最近才开始对此发出警告。 (2认同)