Переполнение стека

Переполнение стека

В программном обеспечении переполнение стека (англ. stack overflow) возникает, когда в стеке вызовов хранится больше информации, чем он может держать. Обычно ёмкость стека задаётся при старте программы/потока. Когда указатель стека выходит за границы, программа аварийно завершает работу.[1]

Эта ошибка случается по двум причинам.[2]

Содержание

Бесконечная рекурсия

Основная причина переполнения стека — излишне глубокая или бесконечная рекурсия. Простейший пример бесконечной рекурсии на Си:

int foo() {
     return foo();
}

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

Многие языки делают оптимизацию, именуемую «хвостовая рекурсия». Рекурсия, находящаяся в конце функции, превращается в цикл и не расходует стека.[4]

Большие переменные в стеке

Вторая большая причина переполнения стека — одноразовое выделение огромного количества памяти крупными локальными переменными. Многие авторы рекомендуют выделять память, превышающую несколько килобайт, в «куче», а не на стеке.[5]

Пример на Си:

int foo() {
     double x[1000000];
}

Массив занимает 8 мегабайт памяти; если в стеке нет такого количества памяти, случится переполнение.

Всё, что уменьшает эффективный размер стека, увеличивает риск переполнения. Например, потоки обычно берут стека меньше, чем основная программа — поэтому программа может работать в однопоточном режиме и отказывать в многопоточном. Работающие в режиме ядра подпрограммы часто пользуются чужим стеком, поэтому при программировании в режиме ядра стараются не применять рекурсию и большие локальные переменные.[6][7]

См. также

Примечания

  1. Burley, James Craig Using and Porting GNU Fortran (1 июня 1991). Архивировано из первоисточника 5 октября 2012.
  2. Danny, Kalev Understanding Stack Overflow (5 сентября 2000). Архивировано из первоисточника 5 октября 2012.
  3. What is the difference between a segmentation fault and a stack overflow? at StackOverflow
  4. An Introduction to Scheme and its Implementation (19 февраля 1997).(недоступная ссылка — история)
  5. Feldman, Howard Modern Memory Management, Part 2 (23 ноября 2005). Архивировано из первоисточника 5 октября 2012.
  6. Kernel Programming Guide: Performance and Stability Tips. Apple Inc. (7 ноября 2006).(недоступная ссылка — история)
  7. Dunlap, Randy Linux Kernel Development: Getting Started (19 мая 2005). Архивировано из первоисточника 5 октября 2012.

Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "Переполнение стека" в других словарях:

  • переполнение стека — Ошибка, возникающая при попытке поместить в стек больше элементов, чем это позволяет выделеное для него место. При отсутствии аппаратного контроля стека это вызывает затирание части кода программы или области данных. [http://www.morepc.ru/dict/]… …   Справочник технического переводчика

  • Переполнение буфера — У этого термина существуют и другие значения, см. Переполнение. Переполнение буфера (Buffer Overflow) явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера. Переполнение буфера обычно… …   Википедия

  • переполнение снизу — антипереполнение Выход за нижнюю границу стека в сторону младших разрядов. [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом Синонимы антипереполнение EN underflow …   Справочник технического переводчика

  • Shellcode — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Код консоли — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Шеллкод — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Шеллкодес — Код оболочки, шелл код (англ. shellcode)  это двоичный исполняемый код, который обычно передаёт управление консоли, например /bin/sh Unix shell, command.com в операционных системах Microsoft Windows. Код оболочки может быть использован как… …   Википедия

  • Электроника Д3-28 — …   Википедия

  • Рекурсия — У этого термина существуют и другие значения, см. Рекурсия (значения). Визуальная форма рекурсии (эффект Дросте) …   Википедия

  • Рекурсивный алгоритм — Рекурсия  метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»