1

我想获取堆栈大小大于分配大小的所有函数,有什么简单的方法可以建议吗?

获取.obj文件,反汇编,然后分析输出文件?

4

2 回答 2

1

在嵌入式计算之外,无限递归比任何特定调用更可能是堆栈溢出的罪魁祸首。

话虽如此,在第一个近似值中,寻找本地分配的数组:

void foo() {
    ...
    char buffer[1024] = "";
    ...
}

另外,不要忘记alloca()call - 它在堆栈上动态分配空间,就像在堆上分配空间一样malloc()

于 2011-08-20T04:47:23.777 回答
1

您可以查看每个函数的程序集转储。在 gcc 中,您使用该-S选项。

假设您对函数感兴趣foo。然后,gcc 将函数名修改为_foo. 如果您看一下程序集,您应该会在函数顶部附近看到一条移动堆栈指针的指令。例如,在 OSX 中你有类似的东西:

_foo:
    ...
    movq %rsp, %rbp
    ...
    subq $48, %rsp

这个数字 ,$48是堆栈大小。

或者,您可以查找等效命令nm用于查找函数开始的地址,ndisasm为您提供人类可读的转储,然后扫描堆栈指针的移动位置。

于 2011-08-20T04:25:07.540 回答