Обеспечивает ли Linux гарантированную недоступную область памяти ниже нижнего конца стека?

Предоставляет ли Linux недоступную область памяти под нижним концом стека, которая имеет гарантированный минимальный размер? И если такой гарантированный минимальный размер существует, то какой?

Или, другими словами, когда я должен начать беспокоиться о том, что alloca() или около того дает мне указатели на действительную нестековую память?


person thejh    schedule 20.03.2014    source источник
comment
Обеспечивает ли это какая-либо система?   -  person Elliott Frisch    schedule 20.03.2014
comment
@ElliottFrisch Ну, я надеюсь на это ... в противном случае вы можете заставить стек перейти в кучу для любой программы, которую можно заставить выделить достаточно ОЗУ, а затем выполнить произвольно большую рекурсию.   -  person thejh    schedule 20.03.2014
comment
Хорошо. Как он называется в системах, где вы его видели? Защита от разрушения стека?   -  person Elliott Frisch    schedule 20.03.2014
comment
@ElliottFrisch Нет, это защита от переполнения буфера, а не от недополнения стека, и это происходит в компиляторе / в пользовательском пространстве и не применяется с использованием отображения памяти или чего-то подобного.   -  person thejh    schedule 21.03.2014
comment
Этот вопрос более или менее дублирует stackoverflow.com/questions/5543330/   -  person Pascal Cuoq    schedule 24.03.2014


Ответы (2)


Как сказано на справочной странице alloca:

Нет индикации ошибки, если кадр стека не может быть расширен. (Однако после неудачного выделения программа, скорее всего, получит сигнал SIGSEGV, если попытается получить доступ к нераспределенному пространству.)

Таким образом, нет никакого указания вообще, и это также говорит:

Если выделение вызывает переполнение стека, поведение программы не определено.

Проблема переполнения стека является общей проблемой с рекурсией и не относится к alloca или, скажем, к массивам переменной длины. Как правило, вам нужно либо найти способ ограничить глубину рекурсии, выполнить рефакторинг для итеративного решения, либо использовать собственный динамический стек (вероятно, не относится к этому случаю).

Обновить

Как обнаружил OP, Linux действительно предоставляет после указания факта с помощью защитной страницы после переполнения стека путем генерации сигнала SIGBUS, который относится к первой части вопроса.

person Shafik Yaghmour    schedule 20.03.2014
comment
Как обнаружил OP, Linux действительно обеспечивает индикацию переполнения стека постфактум, генерируя сигнал SIGBUS. Но мой вопрос о надежности этого для больших распределений — вы не всегда получаете сигнал для этого, иногда ваша программа молча продолжает и делает идиотские вещи. Мой вопрос заключается в том, какой максимальный размер для alloca(), прежде чем мне придется беспокоиться о том, что моя программа делает действительно плохие вещи, а не просто падает. - person thejh; 21.03.2014
comment
@thejh Я добавил это только для полноты картины, поскольку ваш вопрос действительно состоял из двух частей. Эта проблема является более общей для рекурсии, и решение требует перепроектирования. - person Shafik Yaghmour; 21.03.2014
comment
Конечно, когда вы искажаете свой код, так что есть пути кода с неограниченной рекурсией, это должно быть исправлено, но огромная разница, может ли кто-то сломать мою программу или заставить ее запускать произвольный код, и это то, о чем мой вопрос. - person thejh; 22.03.2014

Спасибо @ElliottFrisch за то, что заставил меня погуглить это с правильным именем... упс.

Похоже, ответ "в новых ядрах: одна страница, в старых ядрах: такой защиты нет".

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=320b2b8de12698082609ebbc1a17165727f4c893

person thejh    schedule 20.03.2014