【问题标题】:Zerofill size overflow in OS X assemblyOS X 程序集中的 Zerofill 大小溢出
【发布时间】:2014-02-03 11:15:16
【问题描述】:

假设以下一段 C++ 代码:

char huge[0x900000000];
char large[0x90000000];

在 OS X 上,编译失败 (g++ -c filename.cc):

….s:4:zerofill size (2415919104.) <0! Ignored.
….s:4:Rest of line ignored. 1st junk character valued 44 (,).

看汇编代码(g++ -S filename.cc):

    .section    __TEXT,__text,regular,pure_instructions
    .globl  _huge
.zerofill __DATA,__common,_huge,1,5
    .globl  _large
.zerofill __DATA,__common,_large,2415919104,5

.subsections_via_symbols

这是 Apple Mountain Lion 上的系统 gcc,即i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)。我还通过 MacPorts 安装了一个版本:g++-mp-4.8 (MacPorts gcc48 4.8.2_0) 4.8.2。这样我得到了基本相同的错误消息,尽管生成的程序集现在看起来像这样:

    .globl _huge
    .zerofill __DATA,__pu_bss5,_huge,38654705664,5
    .globl _large
    .zerofill __DATA,__pu_bss5,_large,2415919104,5
    .constructor
    .destructor
    .align 1
    .subsections_via_symbols

在我看来,所有这些都至少像一个错误:显然,汇编器确实将该大小解释为带符号的 32 位数量,而不考虑溢出。不过,我不确定在哪里报告这个问题:这是一个 GCC 错误,要使用 GCC 错误跟踪器报告吗?或者它是苹果汇编程序中的一个错误,我应该尝试针对 XCode 或类似的东西报告它?如果是这样,具体如何?或者这实际上是这里使用的 LLVM 软件,我应该在那里报告?

那么系统gcc 在其汇编输出中生成错误大小这一事实又如何呢?由于 MacPorts 版本处理得更好,我认为 GCC 开发人员在此期间已经修复了这个问题,Apple 最终可能会接受这个问题。您是否同意这一点,还是我应该在某处提交第二份报告以解决此问题?

【问题讨论】:

  • 我建议向 Apple 提交这两个错误。然后,也许您应该在将其提交给 4.2.1 上游 GCC 之前检查该错误。根据reference,OSX 汇编程序不支持大于 2,147,483,647 的数字常量。
  • 为此提交了 Apple 错误报告 #15977897。

标签: c++ macos gcc integer-overflow bug-reporting


【解决方案1】:

Apple 工程师以这种方式向我的错误报告 #15977897 报告:

llvm-gcc 几年来一直不受支持。请使用clang。

使用 clang 确实有效。至少没有错误消息,并且目标文件似乎确实有一个大小合适的__DATA 段,上面标有S_ZEROFILL 标志。这是我使用MachOView 工具发现的。 clang 生成的汇编代码看起来也很正常:两个变量的大小都正确。

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多