为什么POSIX与ISO C标准相矛盾?

3

See http://pubs.opengroup.org/onlinepubs/009696699/basedefs/sys/socket.h.html

(http://pubs.opengroup.org/onlinepubs/9699919799来自2013年的第7版,至今仍然如此!)

sockaddr_storage旨在转换为其他结构类型,但这与ANSI和ISO C标准的别名规则相矛盾, 据我所知。 (对象可能不通过指向不兼容类型的指针进行访问,但有一个例外,即任何内容 都可以通过3个char类型进行访问,并且结构及其第一个成员是可互换的。)

我知道在C标准化之前,使用套接字的做法已经存在了很长时间,但POSIX应该符合ISO C的标准, 实际上它在手册中与标准相矛盾。(即使在较新版本的POSIX中也是如此。)

他们为什么一开始就要这样做?为什么他们没有改变它?


1
dl_函数族也存在同样的问题。 - Karoly Horvath
我认为这基本上是 C 语言中的“穷人继承”。它很有用,许多人使用它,甚至一些标准也默认使用它,在所有“传统”的架构上都可以完美地工作,但 ISO C 标准也费尽心思地编写以适应非传统架构(即使这些非传统架构,如果它们中的任何一个在此时存在,也将无法支持例如 Posix)。 - Steve Summit
@SteveSummit,我认为你是错的;这不是关于目标架构的问题,而是关于标准的问题。据我所知,GCC和Clang需要-fno-strict-aliasing才能正确编译符合POSIX意图的代码。 - user2373145
@SteveSummit 这其实是个糟糕的借口。标准就是用来遵守的。 - Eugene Sh.
自1988年起,Posix日期开始流行,C语言在1989年被标准化。从那时起,语言实现者和使用者之间的争论就一直存在。 - Hans Passant
显示剩余2条评论
2个回答

3
严格别名规则在标准中限制用户代码而非实现代码。由于POSIX头文件和库是实现的一部分,因此POSIX和C标准之间实际上不存在冲突。
在开源平台中,特别是在Linux中,C库和编译器由不同的团队开发,这使得实现者的生活变得困难,但这并不是您的问题。例如,实现者可以:
- 避免暴露标准之间的潜在冲突(即禁用严格别名优化); - 承认他们的实现不符合POSIX标准(并注意,例如,没有经过POSIX认证的Linux发行版); - 提供设施以确保潜在冲突的设施实际上不冲突。从C标准的角度来看,这将是一种扩展。
最后一种选择是gcc和glibc团队正在努力解决sockaddr问题的方式;请参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71255

请注意,有些发行版已经获得了POSIX认证;请参见此处:https://unix.stackexchange.com/questions/293396/is-there-a-linux-distro-thats-unix-certified。这些发行版之所以罕见,是因为认证存在显著的经济成本,这对大多数Linux发行版来说是难以承受的。 - Gabriel Ravier

2
事实上,我认为这里没有违反严格别名规则。是的,在调用函数时,您将其转换为不同的类型,但谁说它必须通过该类型的指针访问?
协议实现知道结构的正确类型,因此当它们访问结构时,它们将其转换回正确的类型。在这里,转换仅用于从一个例程传递指针到另一个例程,但转换后的类型未用于访问数据。

协议实现知道结构的正确类型,也许他们知道,也许不知道。如果他们知道,为什么sa_familystruct sockaddr的一部分呢? - n. m.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接