【问题标题】:What does an "alignment trap" error means?“对齐陷阱”错误是什么意思?
【发布时间】:2018-08-03 05:46:04
【问题描述】:

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

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

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

注意:我不是想通过这个答案获得针对特定错误的解决方案建议,但是,正如问题标题所暗示的那样,理解“对齐陷阱”错误的含义。这就是为什么我不打算放源代码之类的原因。

【问题讨论】:

  • 请添加定义结构和访问功能的代码。
  • @user694733 好吧,我不确定这是否会偏离主题。我不是在寻求针对此问题的特定于错误的解决方案,而是要了解“对齐陷阱”背后的一般概念以及解决方法的一般性(Basile 提供的答案正是我的想法)回答这个问题)。在阅读了 Basile 的回答并注意到这是一个相当广泛的错误之后,我只提到了结构的东西来缩小范围。
  • 很公平。 Basiles 的回答几乎涵盖了它。就个人而言,我会首先调查任何可能隐藏编译器警告/错误的指针转换。这闻起来像一个幼稚的反序列化代码。

标签: c


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    如果你有__attribute__((packed))这样的数据结构,你可以得到它们:

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

    对b 的访问将是未对齐的,因此会导致对齐陷阱。你必须把memcpy的数据变成一个对齐的值,然后访问它。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2015-02-20
      • 2013-12-21
      • 1970-01-01
      • 2015-04-27
      • 2011-12-13
      • 2016-06-11
      • 2011-03-15
      • 2021-12-04
      相关资源
      最近更新 更多