【问题标题】:Emit warning on unaligned memory access?对未对齐的内存访问发出警告?
【发布时间】:2014-06-25 19:06:52
【问题描述】:

有没有办法让 Clang、GCC 或 Visual Studio 在内存访问未对齐时发出运行时警告,最好还发出源代码位置?

我需要在我庞大的遗留资源(不是我自己编写的)中找到所有包含未对齐访问的位置,然后将它们显式包装在过滤器中,从而使它们对齐。

我需要这个来将源移植到会因访问未对齐而中断的平台。

【问题讨论】:

  • 代码是否有很多#pragma pack 指令?它们是主要原因。
  • 您不能确定您的目标编译器布局结构或数据元素的方式是否与您的 pc 编译器相同。那么这个警告的价值是什么?
  • “编译器会发出运行时警告”吗?!这应该如何工作?
  • @thesaint 你没抓住重点。一般编译器编译不运行代码。
  • @luk32:没关系可能是最好的。我们不是在这里上什么老生常谈的高中班。当然编译器不会运行代码。但它可以添加在运行时运行 OMG 的仪器......认真

标签: c++ visual-c++ gcc g++ clang


【解决方案1】:

GCC 有the -Wcast-align option。但是,它会引发编译时警告,而不是运行时警告,因为编译器无法引发运行时警告或错误。

如果您需要更多信息,我建议您阅读this SO question,其中讨论了未对齐的内存。

编辑:添加了关于 GCC 提高编译时间而不是运行时警告的部分。

【讨论】:

    【解决方案2】:

    另一种方法是通过设置EFLAGS 寄存器的第18 位(对齐检查)来引发异常。如果您在 x86[-64] 上进行开发,并且代码覆盖率足够,那么这可能是一种有用的运行时机制来跟踪未对齐的 R/W。

    使用 gcc/clang:

    __asm__ ("pushf\n\t"
             "orl $ 0x40000, (%esp)\n\t"
             "popf\n\t");
    

    相关问题herehere。编译时检查也可能有用,但对动态地址没有帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-07
      • 2013-10-21
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2014-09-04
      • 2011-07-04
      • 2012-08-03
      相关资源
      最近更新 更多