gpt4 book ai didi

在编译时检查堆栈使用情况

转载 作者:太空狗 更新时间:2023-10-29 16:23:10 26 4
gpt4 key购买 nike

有没有办法知道并输出 C 中函数在编译时所需的堆栈大小?这是我想知道的:

让我们来看看一些函数:

void foo(int a) {
char c[5];
char * s;
//do something
return;
}

编译这个函数时,我想知道调用它时会消耗多少堆栈空间。这可能有助于检测隐藏大缓冲区的结构的栈上声明。

我正在寻找可以打印如下内容的东西:

文件 foo.c : 函数 foo 堆栈使用量为 n 字节

有没有办法不看生成的程序集就知道?或者可以为编译器设置的限制?

更新:我不是要避免给定进程的运行时堆栈溢出,我正在寻找一种方法来在运行时之前找到,如果由编译器确定的函数堆栈使用可用作编译的输出过程。

让我们换一种说法:是否有可能知道一个函数的所有局部对象的大小?我猜想编译器优化不会成为我的 friend ,因为一些变量会消失,但上限没问题。

最佳答案

Linux 内核代码在 x86 上的 4K 堆栈上运行。因此他们关心。他们用来检查的是他们编写的 perl 脚本,您可以在最近的内核 tarball(2.6.25 已经获得)中找到 scripts/checkstack.pl。它在 objdump 的输出上运行,使用文档在初始评论中。

我想我很久以前就已经将它用于用户空间二进制文件,如果您了解一点 perl 编程,那么在它损坏时修复它很容易。

无论如何,它基本上所做的是自动查看 GCC 的输出。内核黑客编写了这样一个工具这一事实意味着没有静态方法可以使用 GCC 来完成它(或者它可能是最近才添加的,但我对此表示怀疑)。

顺便说一句,使用 mingw 项目和 ActivePerl 中的 objdump,或者使用 Cygwin,您应该也能够在 Windows 以及使用其他编译器获得的二进制文件上执行此操作。

关于在编译时检查堆栈使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/126036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com