如何在macbook pro(英特尔64位处理器)上演示C中的内存不对齐错误

时间:2016-08-28 21:29:48

标签: objective-c c clang memory-alignment

为了理解C内存对齐或任何术语(数据结构对齐?),我正在尝试编写导致对齐错误的代码。让我了解这一点的原因是我正在编写数据解析代码,用于读取通过网络接收的二进制数据。数据包含一些uint32s,uint64s,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);

在我的机器上,两个整数都打印出来。 (macbook pro采用英特尔64位处理器,不确定究竟是什么确定了对齐行为,是架构?还是精确的CPU型号?或编译器可能?我使用Xcode这样的铿锵声)

我想我的处理器/机器/设置支持未对齐的读取,因此它可以毫无问题地使用上述代码。

如果因为代码没有在帐户中进行对齐而解析说uint32_t会失败的情况会是什么?有没有办法让它在现代的英特尔64位系统上失败?或者在使用整数和浮点数(没有结构)这样的简单数据类型时,我是否可以避免对齐错误?

编辑:如果有人在稍后阅读,我会发现一个类似的问题并提供有趣的信息:Mis-aligned pointers on x86

1 个答案:

答案 0 :(得分:1)

通常,x86架构没有对齐要求[除movdqa之类的SIMD指令外。

但是,因为你尝试编写代码来导致这样的异常......

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

请参阅我的答案:any way to stop unaligned access from c++ standard library on x86_64?了解详细信息以及一些生成例外的示例程序。