gpt4 book ai didi

我可以通过网络发送一个二进制形式的整数而不必担心陷阱值的 UB 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:41 27 4
gpt4 key购买 nike

坦率地说,这样的代码是否有效(除了缺乏必要的错误检查,为简单起见此处省略)?

通过互联网发送数据的代码:

uint16_t i = htons(500);

sendto(sockfd, &i, sizeof(uint16_t), 0, &dest_addr, sizeof(struct sockaddr_in));

接收此数据的代码:

uint16_t i;
recvfrom(sockfd, &i, sizeof(uint16_t), 0, src_addr, sizeof(struct sockaddr_in));
i = ntohs(i);
if(i < 100 || i > 1000)
fprintf(stderr, "Received invalid data over the network\n");
else
do_something(i);

我担心的是,自从我读到 C 标准允许除 unsigned char 之外的任何类型的陷阱值时,我是否有可能通过网络收到这样的陷阱值,因此,我将在编写 i = ntohs(i)?

时立即获得 UB

或者 POSIX 是否保证 uint16_tuint32_t 不应该有陷阱值?

或者它不是由任何官方标准保证的,但是绝大多数实现没有 uint16_tuint32_t 的陷阱值,因此根据这个 de-事实标准我不必担心这个?

最佳答案

C99 指定固定宽度类型必须是二进制补码并且没有填充位。标准中关于陷阱表示的部分说,在整数类型中,只有填充位会导致陷阱表示。因此,我们甚至不需要深入研究 POSIX 就能确定您的代码是否正常。

POSIX 还使所有整数类型补码(我现在找不到这个,要么它说得如此明确,要么是 POSIX 中某些其他事情的结果,我不记得了)。

关于我可以通过网络发送一个二进制形式的整数而不必担心陷阱值的 UB 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43735827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com