Automatic Storage Duration — C va C++ kabi tillarda blockga kirilganda obyekt lifetime’i boshlanib, blockdan chiqilganda tugaydigan storage duration. Oddiy local variable ko‘pincha shu turga ega.
Lifetime semantikasi
Storage amalda stack frame’da bo‘lishi mumkin, lekin standart semantika stackni majbur qilmaydi. Optimizer variable’ni registerda saqlashi yoki butunlay yo‘qotishi mumkin.
Joylashuv
Har function chaqiruvi recursive bo‘lsa ham local obyektning alohida instansiyasini yaratadi. C++ constructor blockga kirishda, destructor normal yoki exception chiqishda scope unwinding bilan ishlaydi.
RAII
Local obyekt addressini tashqariga qaytarish lifetime tugagach dangling pointer beradi. Reference escape faqat backing storage uzoqroq yashasa xavfsiz. Compiler warning va sanitizer buni topishi mumkin.
Escape xatosi
Variable-length array yoki katta local stack overflow xavfini oshiradi. Lifetime boshlanishi declaration nuqtasi va control flowga bog‘liq; initializationdan oldingi read yaroqsiz.
Stack sarfi
static kalit so‘zli local automatic emas, static storage durationga ega. Thread-local local esa thread storage duration oladi. Scope va storage duration bir xil tushuncha emas.
Tekshiruv
Test recursion, exception, early return, destructor order va escaped addressni qamraydi. Optimization levelda observable constructor/destructor semantikasi saqlanadi.
Amaliy nazorat
Automatic Storage Duration bilan ishlaydigan tizim scope, lifetime va destructor stateni 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 — local addressning scope’dan chiqib ketishi. 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 recursion, exception va sanitizer 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.
Automatic storage duration C va C++dagi block scope bilan ko‘p uchrasa-da, scope va storage duration bir xil tushuncha emas. Obyekt blockga kirilganda yaratiladi va normal chiqish yoki stack unwindingda lifetime tugaydi; kompilyator uni registerda saqlashi ham mumkin. C++ destructor tartibi qurilishning teskarisi bo‘lib, RAII lock va fayl handlelarini istisno paytida ham bo‘shatadi. Lokal obyekt manzilini qaytarish lifetime tugagach dangling pointer hosil qiladi. Escape analysis mavjud tillarda runtime obyektni heapga ko‘chirishi mumkin, ammo bu C/C++dagi noto‘g‘ri pointer qaytarishni qonuniy qilmaydi.
Bog‘liq tushunchalar
local variable, object lifetime, stack frame, scope, dangling pointer, RAII