gpt4 book ai didi

c++ - std::memcmp 可以读取第一个差异之后的任何字节吗?

转载 作者:可可西里 更新时间:2023-11-01 18:36:33 24 4
gpt4 key购买 nike

考虑:

constexpr char s1[] = "a";
constexpr char s2[] = "abc";
std::memcmp(s1, s2, 3);

如果 memcmp 在它看到的第一个差异处停止,它不会读取超过 s1 的第二个字节(nul 终止符),但是我在 C 标准中没有看到任何东西来证实这一点行为,而且我不知道 C++ 中有任何扩展它的东西。

n1570 7.24.4.1 PDF link

int memcmp(const void *s1, const void *s2, size_t n);

The memcmp function compares the first n characters of the object pointed to by s1 to the first n characters of the object pointed to by s2

我的理解是否正确,即标准将行为描述为读取两个参数的所有 n 字节,但库可以像短路一样短路?

最佳答案

不能保证函数短路,因为标准没有规定必须短路。

不仅不能保证短路,而且实际上许多实现都不会。例如,glibc比较 unsigned long int 类型的元素(最后几个字节除外),因此它最多可以读取超过 64 位实现比较不同的位置的 7 个字节。

有些人可能认为这不会导致平台 glibc 目标上的访问冲突,因为对这些 unsigned long int 的访问将始终对齐,因此不会跨越页面边界。但是当两个源的对齐方式不同时,glibc 将从其中一个源中读取两个连续的 unsigned long int,它们可能在不同的页面中。如果不同的字节位于其中的第一个字节中,则在 glibc 执行比较之前仍会触发访问冲突(参见函数 memcmp_not_common_alignment)。

简而言之:指定一个大于缓冲区实际大小的长度是未定义的行为,即使不同的字节出现在该长度之前,并且可能导致常见实现崩溃。

这是它可能崩溃的证据:https://ideone.com/8jTREr

关于c++ - std::memcmp 可以读取第一个差异之后的任何字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661860/

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