НАЧАТЬ {...}; в Perl

Размер стека основного потока процесса не может превышать установленный предел. Значение по умолчанию этого ограничения составляет 8 МБ. Превышение этого предела приведет к ошибке сегментации, и процессу будет отправлен сигнал SIGSEGV, что по умолчанию уничтожит его. Максимальный размер стека можно изменить с помощью ulimit -sперед запуском программы. Ядро не перемещается по областям памяти (, таким как область mmap ), после запуска программы и не может этого делать, потому что обычно в эту область указывают указатели, которые после перемещения указывают на неправильные адреса.

Однако проверка на переполнение стека выполняется при доступе к памяти стека, поэтому простое выполнение большого выделения в стеке или иное изменение значения указателя стека не обязательно вызывает ошибку.

Летом 2017 года ходили разговоры о возможности эксплуатации такого поведения. Если какой-то злоумышленник может обмануть программу, чтобы выделить большой объем памяти,это может привести к тому, что указатель стека пропустит защитную область и вместо этого укажет на допустимую, но другую область. Это открывает возможности для некоторых хитрых уловок, чтобы взять под контроль процесс. См. эту статью lwn.net для обсуждения этого вопроса.

4
10.09.2018, 04:10
1 ответ

Первый BEGINне запускается, пока он полностью не определен (см. документацию). Этого не происходит до конца последнего}.

Другие запускаются по мере их полного определения — раньше.

10
27.01.2020, 20:47

Теги

Похожие вопросы