【问题标题】:-Wstack-usage=byte-size in GCC-Wstack-usage=GCC 中的字节大小
【发布时间】:2021-12-25 20:17:35
【问题描述】:

上面提到的 GCC 标志给我带来了一些困惑。
Here 它说如下:

-Wstack-usage=字节大小

如果函数的堆栈使用量可能超过字节大小,则发出警告。确定堆栈使用情况的计算是保守的。在确定是否发出警告时,编译器会包含通过 alloca、可变长度数组或相关构造分配的任何空间。

那么“确定堆栈使用情况的计算是保守的。”是什么意思?

我链接了一个用 C++ 编写的小程序,并特意使用-Wstack-usage=1 来查看各种函数的警告和堆栈使用情况。

一些警告信息如下所示:

Util.cpp: In function 'getCharInput.constprop':
Util.cpp:113:6: warning: stack usage is 64 bytes [-Wstack-usage=]
  113 | void util::getCharInput( char* const inputBuffer, const std::streamsize streamSize )
      |      ^
Main.cpp: In function 'main':
Main.cpp:10:5: warning: stack usage is 112 bytes [-Wstack-usage=]
   10 | int main( )
      |     ^

为什么main 的堆栈使用量只有 112 字节,尽管它调用了所有其他函数?在被调用者返回并从main 的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧上吗?不过我可能有错误的知识。

【问题讨论】:

  • 我们应该猜不到您的代码吗?
  • @S.M.代码很小,但仍可能超过 2000 LOC。你希望我如何展示它?如果你真的需要看的话,去here
  • @digito_evo 看到这个:minimal reproducible example
  • @S.M.所以我想我可能以错误的方式理解了一些东西。因为少数函数有 240、912 等堆栈使用。他们被main 调用过一次,这就是我感到困惑的原因。我猜链接器不会检查每个函数的调用堆栈,而只是报告每个函数自己范围的大小。
  • @Kamil,不,这不是它的意思。说它是“保守的”意味着它倾向于高估堆栈使用量,因此如果估计存在不确定性,它更有可能发出警告。

标签: c++ gcc x86-64 stack-memory gcc-warning


【解决方案1】:

为什么 main 调用了所有其他函数,但堆栈使用量只有 112 字节?

GCC 计算堆栈使用量仅针对此函数。这也在文档中:“警告如果堆栈使用函数可能超过字节大小”。

在被调用者返回并从main的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧中吗?

是的,所以当执行该代码时会发生这种情况。 GCC 不会静态遍历整个调用堆栈。它只是为一个特定函数计算堆栈使用量,并检查该单个特定函数的使用量是否大于某个阈值。

【讨论】:

  • 哦,这就是我错的部分。链接器不检查每个函数的调用堆栈。我明白了。
  • 有没有办法检查程序的整个堆栈使用情况?还有在 Windows 和 GCC (mingw-64) 上堆栈使用的限制是什么?什么时候发生溢出?
  • Is there a way I can check the whole stack usage of a program? 这个问题一般无法解决(递归函数)。无论如何stackoverflow.com/questions/389219/…stackoverflow.com/questions/126036/… 和谷歌上的类似链接。 what is the limit for stack..不知道。 When does an overflow happen?在维基百科上搜索什么是堆栈溢出。
  • 感谢您的链接。有人提到stackanalyzer,但它不是免费的。你认为 Visual Studio 2022 中有一个工具可以帮助我在运行程序时检查堆栈使用情况吗?
  • @digito_evo:在 Windows 上,不知道。在 Linux 上,您在启动程序之前使用ulimit -s。 IDK如果可以mmap栈区下面的页面;我认为它们被保留为保护页面。对于新线程,您可以在创建线程之前指定它,因为线程堆栈只是一个正常的分配。
猜你喜欢
  • 2015-12-31
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2010-11-25
  • 2010-09-18
相关资源
最近更新 更多