gpt4 book ai didi

c - glibc 的严格别名规则和 strlen 实现

转载 作者:太空狗 更新时间:2023-10-29 17:09:49 24 4
gpt4 key购买 nike

一段时间以来,我一直在阅读有关严格别名规则的内容,但我开始感到非常困惑。首先,我已经阅读了这些问题和一些答案:

根据他们的说法(据我所知),使用指向另一种类型的指针访问 char 缓冲区违反了严格的别名规则。但是,strlen() 的 glibc 实现有这样的代码(删除了注释和 64 位实现):

size_t strlen(const char *str)
{
const char *char_ptr;
const unsigned long int *longword_ptr;
unsigned long int longword, magic_bits, himagic, lomagic;

for (char_ptr = str; ((unsigned long int) char_ptr
& (sizeof (longword) - 1)) != 0; ++char_ptr)
if (*char_ptr == '\0')
return char_ptr - str;

longword_ptr = (unsigned long int *) char_ptr;

himagic = 0x80808080L;
lomagic = 0x01010101L;

for (;;)
{
longword = *longword_ptr++;

if (((longword - lomagic) & himagic) != 0)
{
const char *cp = (const char *) (longword_ptr - 1);

if (cp[0] == 0)
return cp - str;
if (cp[1] == 0)
return cp - str + 1;
if (cp[2] == 0)
return cp - str + 2;
if (cp[3] == 0)
return cp - str + 3;
}
}
}

longword_ptr = (unsigned long int *) char_ptr; 行显然将 unsigned long int 别名为 char。我不明白是什么让这成为可能。我看到代码处理对齐问题,所以没有问题,但我认为这与严格的别名规则无关。

第三个链接问题的公认答案是:

However, there is a very common compiler extension allowing you to cast properly aligned pointers from char to other types and access them, however this is non-standard.

我唯一想到的是 -fno-strict-aliasing 选项,是这样吗?我无法在 glibc 实现者所依赖的任何地方找到它的记录,并且评论以某种方式暗示这个转换是在没有任何顾虑的情况下完成的,就像很明显不会有任何问题一样。这让我觉得这确实很明显,我遗漏了一些愚蠢的东西,但我的搜索失败了。

最佳答案

在 ISO C 中,此代码将违反严格的别名规则。 (并且还违反了不能定义与标准库函数同名的函数的规则)。然而,这段代码不受 ISO C 规则的约束。标准库甚至不必用类 C 语言实现。该标准仅指定实现实现标准功能的行为。

在这种情况下,我们可以说实现是在类似 C 的 GNU 方言中,如果代码是使用作者预期的编译器和设置编译的,那么它将成功实现标准库函数。

关于c - glibc 的严格别名规则和 strlen 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446659/

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