Я не могу говорить для всех платформ, но, как это происходит, я просто потратил некоторое время на работу с файлами .exe Windows (я имею в виду, фактически изучая их двоичный формат - я знаю, в некотором смысле, все мы здесь работают с исполняемыми файлами;)). Готов поспорить, что большинство других платформ имеют аналогичные возможности, но я не знаком с ними сразу.
Часть самого формата файла включает в себя два значения, относящиеся к текущему обсуждению:
typedef struct _IMAGE_OPTIONAL_HEADER {
...
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
...
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
Из MSDN:
SizeOfStackReserve
Количество байтов, резервируемых для
стек. Только память, указанная
член SizeOfStackCommit является
совершено во время загрузки; остальное
сделал доступной одну страницу за раз
пока этот резервный размер не будет достигнут.
SizeOfStackCommit
Количество байтов для фиксации для
стек.
Другими словами, компоновщик определяет максимальный размер стека программы. Если вы достигнете максимального размера, вы переполнитесь - независимо от того, как вы достигли максимального размера. Вы можете написать простую программу, чтобы сделать это в одной строке кода, просто выделив одну переменную стека (скажем, массив), которая больше максимального размера стека. Или вы можете сделать это с помощью бесконечной (или конечной, но очень глубокой) рекурсии или просто выделив слишком много переменных стека.
Компоновщик Microsoft по умолчанию устанавливает это значение в 1 МБ на платформах X86 (4 МБ в системах Itanium). На первый взгляд это кажется малым для современной системы. Однако более современные версии Windows интерпретируют эти значения немного по-разному. Вместо того, чтобы полностью ограничивать стек, он ограничивает физическую память, которую будет использовать стек. Если ваш стек выходит за рамки этого, задействуется виртуальная память, поэтому вы все равно должны быть в порядке ... при условии, что у вас достаточно виртуальной памяти.
Помните, что позволяет исчерпать память даже в современных системах с огромным объемом оперативной памяти и большим количеством виртуальной памяти на диске. Вам просто нужно выделить действительно большие объемы данных.
Итак, короче говоря: возможно ли переполнить стек без бесконечной рекурсии? Определенно. Это вероятно? Не совсем, если только вы не размещаете действительно огромные объекты.