【发布时间】:2010-09-30 10:39:34
【问题描述】:
在 x86 Linux 系统上,某些情况会导致堆栈溢出:
-
struct my_big_object[HUGE_NUMBER]在堆栈上。穿过它最终会导致SIGSEGV。 -
alloca()例程(类似于malloc(),但使用堆栈,自动释放自身,如果它太大,也会与SIGSEGV一起爆炸)。 更新:alloca() 并没有像我最初所说的那样被正式弃用;只是不鼓励。
有没有办法以编程方式检测本地堆栈对于给定对象是否足够大?我知道堆栈大小可以通过ulimit 调整,所以我希望有一种方法(但它可能是不可移植的)。理想情况下,我希望能够做这样的事情:
int min_stack_space_available = /* ??? */;
if (object_size < min_stack_space_available)
{
char *foo = alloca(object_size);
do_stuff(foo);
}
else
{
char *foo = malloc(object_size);
do_stuff(foo);
free(foo);
}
【问题讨论】:
-
这是否有机会发生在一个线程中?我试图重现段错误,但在尝试非常大的尺寸时,alloca() 只得到 NULL。
-
是的,alloca() 最初是在一个从多个线程调用的函数中。