OS X组件中的Zerofill尺寸溢出
Zerofill size overflow in OS X assembly
假设以下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
这与苹果山狮的系统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错误吗?还是Apple Assembler中的错误,我应该尝试针对Xcode报告它?如果是这样,到底怎么样?还是这实际上是在这里使用的LLVM软件,我应该在此报告?
以及系统gcc
在其装配输出中产生错误的大小的事实如何?由于Macports版本处理得更好,因此我认为GCC Devs同时已将其修复,Apple最终可能会选择它。您是否同意这一点,还是我应该在某个地方提交第二个报告来解决此问题?
苹果工程师以这种方式向我的错误报告#15977897报告:
LLVM-GCC已经不支持了几年。请使用clang。
使用clang确实有效。至少没有错误消息,并且对象文件似乎确实具有带有S_ZEROFILL
标志的正确大小的__DATA
段。我使用Machoview工具发现了这一点。汇编代码clang生成的外观也很理智:它具有两个变量的正确尺寸。
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 如何修复此特征矩阵反演溢出错误?
- OS X组件中的Zerofill尺寸溢出