Размер стека основного потока процесса не может превышать установленный предел. Значение по умолчанию этого ограничения составляет 8 МБ. Превышение этого предела приведет к ошибке сегментации, и процессу будет отправлен сигнал SIGSEGV
, что по умолчанию уничтожит его. Максимальный размер стека можно изменить с помощью ulimit -s
перед запуском программы. Ядро не перемещается по областям памяти (, таким как область mmap ), после запуска программы и не может этого делать, потому что обычно в эту область указывают указатели, которые после перемещения указывают на неправильные адреса.
Однако проверка на переполнение стека выполняется при доступе к памяти стека, поэтому простое выполнение большого выделения в стеке или иное изменение значения указателя стека не обязательно вызывает ошибку.
Летом 2017 года ходили разговоры о возможности эксплуатации такого поведения. Если какой-то злоумышленник может обмануть программу, чтобы выделить большой объем памяти,это может привести к тому, что указатель стека пропустит защитную область и вместо этого укажет на допустимую, но другую область. Это открывает возможности для некоторых хитрых уловок, чтобы взять под контроль процесс. См. эту статью lwn.net для обсуждения этого вопроса.
Первый BEGIN
не запускается, пока он полностью не определен (см. документацию). Этого не происходит до конца последнего}
.
Другие запускаются по мере их полного определения — раньше.