Stack Underflow — stackdan element olish, frame qaytarish yoki stack pointerni siljitish amali mavjud pastki chegaradan ham past holatga o‘tishga uringan xato.
Data stack
Data-structure stackda pop empty holatda underflow beradi. API error, optional result yoki exception qaytarishi mumkin. Sentinelni haqiqiy element bilan aralashtirish noaniqlik yaratadi.
Call stack
Call stackda corrupted return sequence, noto‘g‘ri calling convention yoki ortiqcha unwind stack pointerni valid frame’dan chiqarishi mumkin. Ko‘pincha bu memory corruptionning oqibati.
Virtual mashina
Operand stackli virtual mashinada bytecode verifier har instruction uchun stack heightni data-flow bilan hisoblaydi. Branch merge nuqtalarida balandlik va type mos bo‘lishi kerak.
Unwinding
Exception unwinder landing pad va frame metadata bo‘yicha aynan mavjud frame’larni yechadi. Buzilgan unwind table underflow yoki noto‘g‘ri return addressga olib kelishi mumkin.
Himoya
Stack canary ko‘proq overflow yozuvini topadi, underflow semantikasini to‘liq qamramaydi. Shadow stack return-address ketma-ketligini himoya qiladi. Bounds metadata zarur.
Sinov
Test empty pop, malformed bytecode, foreign calling convention, exception nesting va corrupted frame’ni qamraydi. Parser/VM xatoda process memorysini o‘qimaydi.
Amaliy nazorat
Stack Underflow bilan ishlaydigan tizim stack height va frame metadatani aniq lifecycle va version bilan yuritadi. Pointer, mapping, navbat yoki exception holati boshqa qatlamga uzatilganda ownership hamda permission shartlari yo‘qolmaydi. Debug rejimda manzil, obyekt identifikatori va state transition qayd etiladi; production log ASLR, maxfiy ma’lumot va raw pointerlarni ochib yubormaydigan shaklga keltiriladi. Eskirgan handle yoki metadata reuse qilinmasligi uchun generation, build-id yoxud reference hisobidan foydalaniladi.
Muhim xavf — empty pop yoki ortiqcha unwind. Bunday vaziyatda tizim taxmin bilan davom etmaydi: access fault, aniq error, konservativ fallback yoki nazoratli cleanup qo‘llanadi. Signal/fault kelgan nuqta har doim asl buzilish joyi emas; allocation, mapping va oxirgi ownership amallari trace’i tashxisga yordam beradi. Parallel accessda lock, atomic ordering va lifetime birgalikda tekshiriladi. Timeout yoki null check memory safetyning o‘rnini bosa olmaydi.
Sifat nazorati bytecode verifier va exception testi orqali bajariladi. Sinovlar normal holat bilan birga nol uzunlik, page boundary, alignment, juda katta offset, concurrent close/free, permission o‘zgarishi va platforma farqlarini qamraydi. Correctness avval etalon hamda invariant bilan tekshiriladi, keyin page fault, cache miss, contention, latency yoki xotira sarfi o‘lchanadi. Sanitizer, fault injection va malformed-input fuzzing topgan minimal holat doimiy regressiya testiga aylantiriladi.
Operand stack ishlatadigan virtual mashinada instruction kerakli operandlar sonini topa olmasa stack underflow aniqlanadi. Bytecode verifier control-flow bo‘ylab stack heightni hisoblab, bunday dasturlarni bajarishdan oldin rad etishi mumkin. Native call stack kontekstida “underflow” kamroq standart atama; return address yoki stack pointer buzilishi ko‘pincha control-flow corruption, invalid unwind yoki protection fault sifatida namoyon bo‘ladi. Parserdagi manual stack uchun popdan oldin bo‘shlikni tekshirish zarur. Fuzzing nested input, erta terminator va noto‘g‘ri exception yo‘llari orqali push/pop invariantini sinaydi.
Error recovery ham stackni aynan bir marta tiklashi kerak; ikki marta pop qilish normal inputdan keyin ham yashirin underflow yaratadi.
Bog‘liq tushunchalar
stack, call frame, operand stack, underflow, bytecode verifier, stack pointer