【问题标题】:Why doesn't this trigger a stack overflow on Ubuntu inside WSL?为什么这不会在 WSL 中的 Ubuntu 上触发堆栈溢出?
【发布时间】:2021-04-26 22:00:33
【问题描述】:
#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    std::cout << sizeof(stack);
    return 0;
}

程序只打印出 4000000000。所以看起来这应该需要将近 4GB 的内存,比我认为的 Ubuntu 堆栈大小的 8MB 大得多。我会在 WSL 中运行它以防万一。

一个想法是它可能会被优化。所以我更新了这样的程序:

#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    for(size_t i{0}; i<array_size; i++)
        stack[i] = i;

    std::cout << sizeof(stack);
    return 0;
}

运行时间稍长,然后输出 4000000000。

看来这是触发溢出的必要条件:

#include <iostream>
 
int main()
{
    constexpr size_t array_size{1000000000};
    int stack[array_size];
    stack[0] = 0;
    for(size_t i{1}; i<array_size; i++)
        stack[i] = stack[i-1] + 1;

    std::cout << sizeof(stack) << "\n";
    std::cout << "Last element: " << stack[array_size - 1] << "\n";
    return 0;
}

【问题讨论】:

  • 有趣的想法。我试图更新代码来初始化数组,我得到了相同的结果。将更新问题。
  • 不改变任何可观察到的结果 (godbolt.org/z/qGzYo6)。制作一个程序,在其中打印所有元素的总和,然后查看。也尝试在关闭优化的情况下编译。
  • 是的,确实如此。看起来您需要做一些不太容易优化的事情。

标签: c++ ubuntu stack stack-overflow


【解决方案1】:

程序(很可能)经过优化,只显示大小,实际上没有分配内存。根据 as-if 规则,这是允许的。

这里有一些示例,您可以将unoptimized(崩溃)与optimized(打印4000000000)结果进行比较。

【讨论】:

  • 你是对的。我尝试了另一个未优化的版本,在该版本中我输出了最后一个元素并且崩溃了。没有意识到 C++ 已经优化到这个级别,非常棒。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多