有没有办法在C编译时知道并输出函数所需的堆栈大小?这是我想知道的:
我们来看一些功能:
void foo(int a) { char c[5]; char * s; //do something return; }
在编译这个函数时,我想知道它被调用时会消耗多少堆栈空间.这可能对检测隐藏大缓冲区的结构的堆栈声明很有用.
我正在寻找能打印出类似内容的东西:
file foo.c:function foo stack usage是n
bytes
有没有办法不看生成的程序集知道?或者可以为编译器设置限制?
更新:我不是试图避免给定进程的运行时堆栈溢出,我正在寻找一种在运行时之前查找的方法,如果编译器确定的函数堆栈使用可用作编译过程的输出.
让我们换一种说法:是否可以知道函数本地所有对象的大小?我猜编译器优化不会成为我的朋友,因为某些变量会消失但是上限很好.
Linux内核代码在x86上的4K堆栈上运行.因此他们关心.他们用来检查它的是他们编写的perl脚本,你可以在最近的内核tarball中找到script/checkstack.pl(2.6.25已经得到它).它运行在objdump的输出上,使用文档在初始注释中.
我想我很久以前就已经将它用于用户空间二进制文件了,如果你知道一些perl编程,如果它被破坏了很容易解决.
无论如何,它基本上做的是自动查看GCC的输出.内核黑客编写这样一个工具的事实意味着没有静态的方法来使用GCC(或者可能是最近添加的,但我对此表示怀疑).
顺便说一下,使用来自mingw项目和ActivePerl的objdump,或者使用Cygwin,你也应该能够在Windows上以及使用其他编译器获得的二进制文件上执行此操作.
StackAnlyser似乎在检查可执行代码本身以及一些调试信息.这个回复描述了什么是我正在寻找的东西,堆栈分析器看起来对我来说太过分了.
与ADA相似的东西会很好.从gnat手册看这个手册页:
22.2静态堆栈使用分析
使用-fstack-usage编译的单元将生成一个额外的文件,该文件指定基于每个函数的最大堆栈使用量.该文件与具有.su扩展名的目标对象文件具有相同的基本名称.该文件的每一行由三个字段组成:
* The name of the function. * A number of bytes. * One or more qualifiers: static, dynamic, bounded.
第二个字段对应于功能框架的已知部分的大小.
限定符static意味着函数框架大小是纯静态的.它通常意味着所有局部变量都具有静态大小.在这种情况下,第二个字段是功能堆栈利用率的可靠度量.
限定符动态意味着函数框架大小不是静态的.它主要发生在某些局部变量具有动态大小时.当此限定符单独出现时,第二个字段不是功能堆栈分析的可靠度量.当它有界限限定时,意味着第二个字段是功能堆栈利用率的可靠最大值.