gpt4 book ai didi

objective-c - 如何在 macbook pro(Intel 64 位处理器)上用 C 语言演示内存错位错误

转载 作者:行者123 更新时间:2023-11-30 15:06:18 24 4
gpt4 key购买 nike

为了理解 C 内存对齐或任何术语(数据结构对齐?),我试图编写导致对齐错误的代码。让我了解这一点的最初原因是我正在编写数据解析代码来读取通过网络接收的二进制数据。数据包含一些 uint32、uint64、 float 和 double ,我想确保它们不会因我的解析代码中的错误而损坏。

由于未对准而导致某些问题的尝试失败:

uint32_t integer = 1027;
uint8_t * pointer = (uint8_t *)&integer;
uint8_t * bytes = malloc(5);
bytes[0] = 23; // extra byte to misalign uint32_t data
bytes[1] = pointer[0];
bytes[2] = pointer[1];
bytes[3] = pointer[2];
bytes[4] = pointer[3];
uint32_t integer2 = *(uint32_t *)(bytes + 1);
printf("integer: %u\ninteger2: %u\n", integer, integer2);

在我的机器上,两个整数打印出来的结果是相同的。 (配备 Intel 64 位处理器的 macbook pro,不确定到底是什么决定了对齐行为,是架构?还是确切的 CPU 模型?或者可能是编译器?我使用 Xcode,所以 clang)

我猜我的处理器/机器/设置支持未对齐读取,因此使用上面的代码没有任何问题。

如果由于代码未考虑对齐而导致 uint32_t 解析失败,会出现什么情况?有没有办法让它在现代 Intel 64 位系统上失败?或者,当使用整数和 float (无结构)等简单数据类型时,我是否可以避免对齐错误?

编辑:如果有人稍后阅读本文,我发现了一个类似的问题,其中包含有趣的信息:Mis-aligned pointers on x86

最佳答案

通常,x86 架构没有对齐要求[除了一些 SIMD 指令,如 movdqa)。

但是,由于您尝试编写代码来引发此类异常...

有一个对齐检查异常位可以设置到 x86 标志寄存器中。如果打开,未对齐的访问将生成异常,该异常将[至少在 Linux 下]显示为总线错误(即 SIGBUS)

在这里查看我的答案:any way to stop unaligned access from c++ standard library on x86_64?了解详细信息和一些生成异常的示例程序。

关于objective-c - 如何在 macbook pro(Intel 64 位处理器)上用 C 语言演示内存错位错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195950/

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