В програмному забезпеченні переповнення стека () відбувається у випадку, коли забагато пам'яті використовується для стека викликів. Стек викликів містить обмежену кількість пам'яті, часто визначену при старті програми. Розмір стека викликів залежить від багатьох факторів, включно з мовою програмування, машинною архітектурою, багатозадачністю і загальним обсягом доступної пам'яті. Коли використовується забагато пам'яті для стека викликів, тоді кажуть, що стек переповнився, зазвичай це виливається в крах програми. Цей тип помилок зазвичай трапляється в результаті двох помилок програмування.
Нескінченна рекурсія
Найзвичайніша причина помилки переповнення стека — це надзвичайно глибока або нескінченна рекурсія. Деякі мови програмування дозволяють нескінченну рекурсію, наприклад, Scheme, яка дозволяє специфічний тип рекурсії — хвостову рекурсію. Це можливо через непотрібність заштовхування адреси повернення в стек.
Приклад нескінченної рекурсії на C. main() { main(); }
Функція main, яка завжди виконується першою, викликає сама себе до моменту переповнення стека.
Занадто великі стекові змінні Інша важлива причина переповнення стека — це спроба виділити у стеку більше пам'яті, ніж він може виділити. Зазвичай це відбувається при створенні занадто великих локальних змінних. З цієї причини змінні великого розміру бажано розміщати динамічно.
Приклад дуже великої стекової змінної на C. main() { double x[1000000]; }
Цей масив вимагає майже 8 мегабайтів пам'яті (припускаємо, що розмір double становить 8), що більше, ніж виділено на стек.
Можливість виникнення цієї помилки збільшується при деяких обставинах. Наприклад, одна й та сама програма при виконанні в одному потоці може працювати добре, а при переході до багатопотоковості може зазнавати краху. Це відбувається через те, що кожне завдання буде мати менший розмір стека, ніж один загальний потік в однопотоковому варіанті.
Див. також Переповнення стекового буфера Переповнення буфера Стек викликів
Примітки