Stack overflow — thread call stacki uchun ruxsat etilgan xotira chegarasidan oshib ketadigan holatdir. Ko‘pincha cheksiz yoki juda chuqur recursion, katta lokal obyekt yoki uzun call chain sabab bo‘ladi. Operatsion tizim guard pagega kirishni faultga aylantiradi; runtime xato chiqarishi, jarayonni tugatishi yoki maxsus exception berishi mumkin.
Sabablar
Base case’ga yetmaydigan recursion har chaqiriqda yangi frame qo‘shadi. To‘g‘ri yakunlanadigan algoritm ham millionlab tugunli degenerate tree’da limitdan oshishi mumkin. Mutual recursion zanjiri oddiy self-call qidiruvida ko‘rinmasligi ehtimol. Input boshqaradigan parser uchun chuqur nested data xavfsizlik riski hisoblanadi.
Stackda katta array yoki struct ajratish bir frame’da limitni tugatishi mumkin. C’dagi variable length array va alloca hajmi runtime inputga bog‘liq bo‘lsa ayniqsa xavfli. Har thread uchun stack kichik berilgan embedded yoki ko‘p oqimli tizimda normal funksiya zanjiri ham yetmasligi mumkin.
Aniqlash
Guard page stackning ruxsat etilmagan chegarasida present bo‘lmagan sahifa bo‘lib, jimgina boshqa xotirani buzishdan oldin fault beradi. Ammo stack pointer juda katta qadam bilan guard ustidan “sakrab” boshqa mappingga tushmasligi uchun stack-clash protection har ma’lum oraliqda sahifaga tegadi.
Runtime recursion depth limitni stack tugashidan oldin tekshirishi mumkin. Python kabi til boshqariladigan exception beradi, lekin native extension undan pastda stackni baribir to‘ldirishi mumkin. Static analyzer katta frame va nazoratsiz recursionni ogohlantiradi.
Tiklash qiyinligi
Stack tugagan paytda odatiy error handlerni chaqirishning o‘zi yangi frame talab qiladi. Runtime emergency stack yoki oldindan ajratilgan signal stackdan foydalanishi mumkin. Kernel double fault uchun alohida stack saqlaydi. Shunga qaramay, jarayon holati xavfsiz davom ettirishga yaroqsiz bo‘lishi mumkin.
Crash dump instruction pointer, stack pointer va takrorlanuvchi frame zanjirini ko‘rsatadi. Optimized buildda tail call va inlining trace’ni o‘zgartiradi. Debug symbol build versiyasiga mos bo‘lishi zarur.
Oldini olish
Chuqur traversal explicit heap stack yoki queue bilan iterative yoziladi. Parser depth, expression nesting va directory recursion limitini belgilaydi. Limit biznesdagi qonuniy maksimal holat va DoS riskiga mos bo‘ladi. Faqat thread stack hajmini oshirish algoritmik muammoni kechiktiradi va ko‘p thread’da xotira sarfini oshiradi.
Katta lokal buffer heap yoki caller bergan workspacega ko‘chiriladi. Compiler frame-size warninglari buildda qat’iy tekshiriladi. Recursion zarur bo‘lsa har frame kichik saqlanadi, progress va base case test qilinadi. Tail-call optimizationga faqat til kafolat bersa tayaniladi.
Stack overflow buffer overflowdan farq qiladi: birinchisi stack sig‘imini tugatish, ikkinchisi ajratilgan buffer chegarasidan tashqariga yozishdir. Stackdagi buffer overflow ham mavjud, lekin mexanizmi va himoyasi alohida.
Thread stack sozlamasi
Thread yaratuvchi API stack hajmini belgilashi mumkin. Virtual manzil rezervi bilan fizik commit bir xil emas; katta limit darhol shuncha RAM egallamasligi mumkin, ammo 32-bit address space va ko‘p thread’da rezerv muhim. Managed runtime stackni platforma defaultidan boshqa boshqarishi yoki goroutine kabi o‘suvchi kichik stack ishlatishi mumkin. Native FFI chuqur chaqiriq qilsa runtime taxmini buzilishi ehtimol. Stack hajmini oshirishdan oldin eng katta frame, recursion depth va signal stack o‘lchanadi. Production crashda avtomatik restart bir xil zararli input qayta kelib crash loop yaratmasligi uchun request limiti va circuit breaker qo‘llanadi.
Bog‘liq tushunchalar
Recursion, Call stack, Guard page, Stack clash, Buffer overflow, Tail call