【问题标题】:force gcc to compile when stack-overflow is detected检测到堆栈溢出时强制 gcc 编译
【发布时间】:2011-05-25 12:50:24
【问题描述】:

如何强制 gcc 编译一个程序,在该程序中我声明一个比我的内存大的无符号整数数组 - 而不会收到警告警告:“表达式中的整数溢出”?

例如。我有 8gb 的内存,我想声明一个 8.5gb 的数组。

编辑:

谢谢大家,我发现问题不在于数据类型,而在于一些预处理器。我花了很长时间。 :) 我写了

#define GIBI 1073741824
#define ARRAYSIZE 2*GIBI

显然编译器不喜欢这样。

【问题讨论】:

  • 如果连内存都装不下,为什么还要有一个比内存大的数组?
  • 警告是警告,而不是错误。 (可以选择是否将警告视为错误。)
  • @BlackBear:以下是人们想要分配比 RAM 更多的内存的几个原因: 1. 虚拟内存意味着您可以拥有比 RAM 更多的可用内存。 2. 您可能正在编译一个程序,该程序将在比您的开发机器拥有更多 RAM 的机器上运行。
  • 这是有道理的。感谢您的解释! ;)
  • @Kristopher Johnson:这与 RAM 大小无关。堆栈大小(或者更准确地说,为堆栈保留的地址范围)从一开始就受到限制,如果尝试alloca() 比堆栈更多的空间,程序将崩溃。但是,在这个问题中,问题出在其他地方。

标签: c gcc stack stack-overflow gcc-warning


【解决方案1】:

如果您需要分配比 RAM 更多的内存,您可以对内存映射文件进行一些研究。这样您就不必担心机器中的物理内存(无论如何您都无法访问所有 8GB)

http://msdn.microsoft.com/en-us/library/dd997372.aspx

【讨论】:

    【解决方案2】:

    integer overflow in expression 不是堆栈溢出,这意味着 GCC 已经检测到您的表达式的结果导致您分配给它的左值中的整数溢出。例如,如果您尝试malloc 类似INT_MAX * 2,该表达式将导致整数溢出。如果将其转换为 size_t,则应该没有警告:

    void *myvar = malloc((size_t) INT_MAX * 2);
    

    size_t 当然是依赖于平台的,如果你不能在sizeof(size_t) 位中表示你想要分配的块的大小,你可能也会溢出。基本上,请确保您使用的类型能够表示您要分配的内存量并且它与size_t 兼容(因为这是malloc() 所期望的,根据stdlib.h)。

    【讨论】:

    • size_t 不能“溢出”。它是未签名的,所以它会换行,但从形式上讲,它不会溢出。 :-)
    • 维基百科说“当算术运算尝试创建一个大于可用存储空间内可以表示的数值时,会发生整数溢出”......基本上正是我所描述的。如果您有更权威的来源,请赐教:)
    【解决方案3】:

    该错误消息并不是说您将用完堆栈,尽管您会。据说这个数字太大,无法在size_t 中表示。确保您正在为 64 位目标进行编译。

    此外,不要那样做。如果您需要分配大量 RAM,请使用 malloc,而不是堆栈。或者,更好的是,使用mmap

    【讨论】:

      【解决方案4】:

      我很确定"integer overflow in expression"? 确实不是意味着你正在溢出堆栈,而是你正在做一些可能会溢出一个有符号整数的数学运算,它是 未定义的行为。如果您粘贴警告所指的行会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-11
        • 2011-10-26
        • 2012-08-14
        • 1970-01-01
        • 2017-03-30
        • 2016-05-15
        • 1970-01-01
        • 2010-10-19
        相关资源
        最近更新 更多