“对齐陷阱”错误意味着什么?

时间:2014-10-20 11:00:20

标签: c

我的一个朋友在尝试调试开始显示"对齐陷阱"的代码时遇到了一个大问题。错误。当特定函数访问全局结构时会发生此问题。

在对网络进行一些研究后,仍然不清楚对齐陷阱是什么?#34;意思是。有人可以给出一个解释,特别注意通常会导致对齐陷阱的问题以及解决问题的方法(不仅仅是关于如何使用调试器,还有问题本身)?

这一切都是在带有嵌入式Linux的ARM处理器(OMAP L138)的C代码中完成的。

注意:我没有尝试使用此答案获取特定于错误的解决方案建议,但是,正如问题标题所示,了解什么是"对齐陷阱& #34;错误意味着这就是我不打算放置源代码等的原因。

2 个答案:

答案 0 :(得分:7)

它是特定于操作系统和处理器的(也是ABI特定的)。

您有一些memory corruptionmemory leakbuffer overflow等等,或者您正在取消引用某些错误的指针(未初始化或错误计算) - 例如指向double的指针,该指针不是8的倍数(或者,在某些体系结构上,指向int的指针不是4的倍数),或者您可能跳转到某个无效地址(例如,一个糟糕的函数指针)。

在Linux上,我建议使用gcc -Wall -g进行编译并使用调试器(gdb)和valgrind。您可能对使用-fsanitize=address-fsanitize=undefined编译标志(使用GCC 4.9)感兴趣。他们都对所生成的代码进行检测(如此修改)。

了解undefined behavior。你肯定有一些。

答案 1 :(得分:0)

每当进行未对齐访问时,对齐陷阱就会由ARM触发。什么是未对齐访问?在访问多字节值时,其指针不是其对齐方式的倍数,例如通过取消引用不是4的倍数的指针来访问uint32_t时。

如果您具有__attribute__((packed))这样的数据结构,则可以获取它们:

struct foo {
    uint8_t a;
    uint32_t b;
} __attribute__((packed));

b的访问将是未对齐的,因此将导致对齐陷阱。您必须memcpy将数据转换为对齐的值,然后再访问它。