Написать пост

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

Аватар Евгений Туренко

Многие программисты, особенно начинающие, теряются в терминах buffer overflow, buffer overrun и stack overflow. В статье дано их объяснение и описано, чем они отличаются.

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

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
9К открытий9К показов