Buffer overflow, buffer overrun и stack overflow: что это значит и в чём отличие

Представьте буфер в виде массива. Переполнение буфера (buffer overflow) происходит тогда, когда вы пытаетесь поместить в массив больше элементов, чем он способен содержать. Проще говоря, речь идёт о записи.

Выход за границы буфера при чтении (buffer overrun) происходит, когда вы выполняете перебор элементов в буфере, выходя за его границы. Иначе говоря, речь идёт о чтении.

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

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

Перевод ответа с портала «Stack Overflow»

Ещё интересное для вас:
Тест: чьё это рабочее место? Угадываем айтишников по их столам
Тест: что вы знаете о работе мозга?
Тест: какой язык программирования вам стоит выбрать для изучения?