В чем разница между ошибкой сегментации и переполнением стека?

Например, когда мы вызываем say, рекурсивную функцию, последовательные вызовы хранятся в стеке. Однако из-за ошибки, если она идет бесконечно, ошибка "Ошибка сегментации" (как видно на GCC).

Разве это не было "переполнение стека"? В чем же основное различие между ними?

Btw, объяснение было бы более полезным, чем ссылки в Википедии (прошел через это, но не ответил на конкретный запрос).

Ответ 1

Переполнение стека - это [a] причина, результатом является ошибка сегментации.


По крайней мере на x86 и ARM "стек" представляет собой кусок памяти, зарезервированный для размещения локальных переменных и возврата адресов вызовов функций. Когда стопка исчерпана, будет доступна доступ к памяти за пределами зарезервированной области. Но приложение не запрашивало ядро ​​для этой памяти, поэтому SegFault будет создан для защиты памяти.

Ответ 2

Стек вызовов переполняется, однако результатом переполнения является то, что в конечном итоге связанные с вызовом значения вставляются в память, которая не является частью стека, а затем - SIGSEGV!

Ответ 3

Современные процессоры используют менеджеров памяти для защиты процессов друг от друга. У менеджера памяти x86 много устаревших функций, одна из которых - сегментация. Сегментация предназначена для того, чтобы некоторые программы манипулировали памятью определенным образом. Например, один сегмент может быть помечен только для чтения, и код будет помещен туда, в то время как другой сегмент будет читать/писать и что там будут ваши данные.

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

Ответ 4

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