В програмному забезпеченні, переповнення стека (англ. stack overflow) відбувається у випадку коли забагато пам'яті використовується для стека викликів. Стек викликів містить обмежену кількість пам'яті, часто визначену при старті програми. Розмір стека викликів залежить від багатьох факторів, включно з мовою програмування, машинною архітектурою, багатозадачністю і загальним обсягом доступної пам'яті. Коли використовується забагато пам'яті для стека викликів, тоді кажуть, що стек переповнився, зазвичай це виливається в крах програми. Цей тип помилок зазвичай трапляється в результаті двох помилок програмування.
Нескінченна рекурсія
Найзвичайніша причина помилки переповнення стека це надзвичайно глибока або нескінченна рекурсія. Деякі мови програмування дозволяють нескінченну рекурсію, наприклад, Scheme, яка дозволяє специфічний тип рекурсії — хвостову рекурсію. Це можливо через непотрібність заштовхування адреси повернення в стек.
Приклад нескінченної рекурсії на C.
main() { main(); }
Функція main, яка завжди виконується першою, викликає сама себе до моменту переповнення стека.
Занадто великі стекові змінні
Інша важлива причина переповнення стека це спроба виділити у стеку більше пам'яті ніж він може виділити. Зазвичай це відбувається при створені занадто великих локальних змінних. З цієї причини змінні великого розміру бажано розміщати динамічно.
Приклад дуже великої стекової змінної на C.
main() { double x[1000000]; }
Цей масив вимагає майже 8 мегабайт пам'яті (припускаємо, що розмір double становить 8), це більше, ніж виділено на стек.
Можливість виникнення цієї помилки збільшується при деяких обставинах. Наприклад, одна й та сама програма при виконанні в одному потоці може працювати добре, а при переході до багатопотоковості програма може зазнавати краху. Це відбувається через те, що кожне завдання буде мати менший розмір стека, ніж один загальний поток в однопотоковому варіанті.
Дивись також
Зноски
- Burley, James Craig (1 червня 1991). Using and Porting GNU Fortran. Архів оригіналу за 5 жовтня 2012. Процитовано 5 вересня 2010.
- Danny, Kalev (5 вересня 2000). Understanding Stack Overflow. Архів оригіналу за 5 жовтня 2012. Процитовано 5 вересня 2010.
- . 19 лютого 1997. Архів оригіналу за 10 серпня 2007. Процитовано 5 вересня 2010.
- Feldman, Howard (23 листопада 2005). Modern Memory Management, Part 2. Архів оригіналу за 5 жовтня 2012. Процитовано 5 вересня 2010.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Perepovnennya steka znachennya Ne plutati z sistemoyu pitan i vidpovidej pro programuvannya Stack Overflow V programnomu zabezpechenni perepovnennya steka angl stack overflow vidbuvayetsya u vipadku koli zabagato pam yati vikoristovuyetsya dlya steka viklikiv Stek viklikiv mistit obmezhenu kilkist pam yati chasto viznachenu pri starti programi Rozmir steka viklikiv zalezhit vid bagatoh faktoriv vklyuchno z movoyu programuvannya mashinnoyu arhitekturoyu bagatozadachnistyu i zagalnim obsyagom dostupnoyi pam yati Koli vikoristovuyetsya zabagato pam yati dlya steka viklikiv todi kazhut sho stek perepovnivsya zazvichaj ce vilivayetsya v krah programi Cej tip pomilok zazvichaj traplyayetsya v rezultati dvoh pomilok programuvannya Neskinchenna rekursiyaNajzvichajnisha prichina pomilki perepovnennya steka ce nadzvichajno gliboka abo neskinchenna rekursiya Deyaki movi programuvannya dozvolyayut neskinchennu rekursiyu napriklad Scheme yaka dozvolyaye specifichnij tip rekursiyi hvostovu rekursiyu Ce mozhlivo cherez nepotribnist zashtovhuvannya adresi povernennya v stek Priklad neskinchennoyi rekursiyi na C main main Funkciya main yaka zavzhdi vikonuyetsya pershoyu viklikaye sama sebe do momentu perepovnennya steka Zanadto veliki stekovi zminniInsha vazhliva prichina perepovnennya steka ce sproba vidiliti u steku bilshe pam yati nizh vin mozhe vidiliti Zazvichaj ce vidbuvayetsya pri stvoreni zanadto velikih lokalnih zminnih Z ciyeyi prichini zminni velikogo rozmiru bazhano rozmishati dinamichno Priklad duzhe velikoyi stekovoyi zminnoyi na C main double x 1000000 Cej masiv vimagaye majzhe 8 megabajt pam yati pripuskayemo sho rozmir double stanovit 8 ce bilshe nizh vidileno na stek Mozhlivist viniknennya ciyeyi pomilki zbilshuyetsya pri deyakih obstavinah Napriklad odna j ta sama programa pri vikonanni v odnomu potoci mozhe pracyuvati dobre a pri perehodi do bagatopotokovosti programa mozhe zaznavati krahu Ce vidbuvayetsya cherez te sho kozhne zavdannya bude mati menshij rozmir steka nizh odin zagalnij potok v odnopotokovomu varianti Divis takozhPerepovnennya stekovogo bufera Perepovnennya bufera Stek viklikivZnoskiBurley James Craig 1 chervnya 1991 Using and Porting GNU Fortran Arhiv originalu za 5 zhovtnya 2012 Procitovano 5 veresnya 2010 Danny Kalev 5 veresnya 2000 Understanding Stack Overflow Arhiv originalu za 5 zhovtnya 2012 Procitovano 5 veresnya 2010 19 lyutogo 1997 Arhiv originalu za 10 serpnya 2007 Procitovano 5 veresnya 2010 Feldman Howard 23 listopada 2005 Modern Memory Management Part 2 Arhiv originalu za 5 zhovtnya 2012 Procitovano 5 veresnya 2010