Существуют определенные условия, которые могут вызвать переполнение стека в системе Linux x86:
struct my_big_object[HUGE_NUMBER]
в стеке. Проходя через это в конечном итоге вызывает
- Подпрограмма
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);
}