gpt4 book ai didi

C 未定义的行为。严格的别名规则,还是不正确的对齐方式?

转载 作者:太空狗 更新时间:2023-10-29 16:36:55 25 4
gpt4 key购买 nike

<分区>

我无法解释这个程序的执行行为:

#include <string> 
#include <cstdlib>
#include <stdio.h>

typedef char u8;
typedef unsigned short u16;

size_t f(u8 *keyc, size_t len)
{
u16 *key2 = (u16 *) (keyc + 1);
size_t hash = len;
len = len / 2;

for (size_t i = 0; i < len; ++i)
hash += key2[i];
return hash;
}

int main()
{
srand(time(NULL));
size_t len;
scanf("%lu", &len);
u8 x[len];
for (size_t i = 0; i < len; i++)
x[i] = rand();

printf("out %lu\n", f(x, len));
}

因此,当它使用 gcc 的 -O3 编译并使用参数 25 运行时,它会引发段错误。没有优化它工作正常。我已经反汇编了它:它正在被矢量化,编译器假定 key2 数组以 16 字节对齐,因此它使用 movdqa。明明是UB,虽然我解释不了。我知道严格的别名规则,但不是这种情况(我希望如此),因为据我所知,严格的别名规则不适用于 char。为什么 gcc 假设这个指针是对齐的?即使经过优化,Clang 也能正常工作。

编辑

我把unsigned char改成了char,去掉了const,还是有段错误。

编辑2

我知道这段代码不好,但据我所知严格的别名规则,它应该可以正常工作。具体违规在哪里?

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