【问题标题】:misalignment warnings fix them or no?错位警告是否可以修复它们?
【发布时间】:2017-03-10 12:14:42
【问题描述】:

在我的自定义 .zip 解压器中,我收到如下警告:

runtime error: load of misaligned address 0x7f280ffe875a for type 'const uint32_t', which requires 4 byte alignment

原因是 reinterpret_castuint32_t* 和相同的取消引用。我知道将memcpy 转换为uint32_t 可以解决问题,但我应该打扰吗?我在许多广泛使用的库(如 pixman、cairo、...)中看到了相同类型的警告。

【问题讨论】:

  • 取决于 x86 上的 CPU 架构,您很可能可以摆脱它。在 ARM 上,它可能会陷入硬件陷阱。但是,您处于未定义行为领域,并且允许编译器假定您没有进行 UB,因此任何事情都可能发生。
  • 不过pixman也可能用在arm国家。
  • 我认为 UB 胜过所有关于 CPU 架构的讨论。我只把它作为我的第二点,因为上面只是一个简短的评论。
  • @user1095108: "但是 pixman 也可能在 arm 国家使用。" 如果有人尝试,它会在 ARM 国家爆炸。未对齐的读取不是您可以忽略的。
  • @NicolBolas 总是有手动 armv6+ 支持未对齐读取。 Pixman 由 cairo 使用,它包含针对它支持的每个平台的优化代码。我认为它知道它有能力打破 x86 上的规则,因为 arm 编译/链接了不同的代码。

标签: c++ memory-alignment type-punning


【解决方案1】:

总是修复它们。您的编译器的向量化器可能会使用对齐信息,并假定您不调用未定义的行为。这可能会导致崩溃。

请参阅:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65709,了解 gcc 开发人员和 L​​Z4 的作者之间对此问题的讨论。

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多