-Wstack-usage=GCC 中的字节大小

-Wstack-usage=byte-size in GCC

上面提到的 GCC 标志让我有些困惑。
Here 内容如下:

-Wstack-usage=byte-size

Warn if the stack usage of a function might exceed byte-size. The computation done to determine the stack usage is conservative. Any space allocated via alloca, variable-length arrays, or related constructs is included by the compiler when determining whether or not to issue a warning.

那么 “为确定堆栈使用而进行的计算是保守的。” 是什么意思?

我链接了一个用 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字节?在被调用者 returns 并从 main 的堆栈帧中删除之前,它不会将被调用者保留在其堆栈帧中吗?虽然我可能有错误的知识。

Why the stack usage of main is only 112 bytes despite that it calls all the other functions?

堆栈使用由 GCC 计算 仅用于此函数。这也在文档中:“如果堆栈使用 函数 可能超过字节大小,则发出警告”。

Doesn't it keep the callee on its stack frame until the callee returns and gets deleted from the stack frame of main?

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