Почему переполнение стека вызывает ошибку сегментации вместо в Linux?

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

Мне просто интересно, почему переполнение стека приводит к ошибке сегментации вместо.

Это потому, что граница предела стека пересекается, что вызывает SIGSEGV? Почему мы не сталкиваемся с переполнением стека в Linux, а скорее с ошибкой сегментации?

int foo()
{
  return foo();
}

Этот небольшой код должен приводить к переполнению стека, а скорее приводит к ошибке сегментации в Linux.

Ответ 1

Переполнение стека может привести к нескольким различным аппаратным ошибкам.

  • Это может привести к попытке получить доступ к памяти, для которой у программы нет соответствующих разрешений → ядро ​​поднимет сигнал SIGSEGV (нарушение сегментации) для процесса.
  • Это может привести к попытке выполнить незаконную инструкцию (например: вы перезаписали обратный адрес, чтобы указать на неверную инструкцию) → ядро ​​поднимет сигнал SIGILL (незаконная команда).
  • Возможно, SIGBUS на некоторых платформах (например, исключение выравнивания).

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

Edit:

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

Ответ 2

Stackoverflow не является ошибкой, это случай, ошибка, отброшенная из нее, изменяется от языка к языку и от платформы к платформе.

Подробнее о ошибка сегментации в вики

EDIT:

Чтобы сделать его более понятным - в вашем случае стек вызовов переполнен, и программа пытается записать следующий вызов на недопустимый адрес, вызывая ошибку сегментации.