Dangling Pointer — avval valid obyekt yoki memory regionga ishora qilgan, lekin o‘sha obyekt lifetime’i tugagach yoki region bo‘shatilgach hali ham saqlanib qolgan pointer.
Paydo bo‘lishi
Heap free/delete, stack scope’dan chiqish, container reallocation yoki memory unmap dangling pointer yaratishi mumkin. Pointer qiymati nullga avtomatik aylanmaydi; address tashqi ko‘rinishda eski holicha qoladi.
Use-after-free
Dangling pointer orqali read/write use-after-free yoki use-after-scope xatosidir. Allocator ayni addressni yangi obyektga bersa xato jim ravishda boshqa ma’lumotni buzishi mumkin.
Aliaslar
Bitta aliasni null qilish boshqa nusxalarni tuzatmaydi. Ownership modeli unique owner, borrow va lifetime qoidalari bilan muammoni kamaytiradi. Reference counting cycle’dan tashqari erta free’ni cheklaydi.
Iteratorlar
Iterator invalidation ham dangling reference shaklidir. Vector growth elementlarni ko‘chiradi; API qaysi operation pointer/iteratorni invalid qilishini hujjatlashtiradi.
Aniqlash
AddressSanitizer freed regionni quarantine va shadow memory bilan belgilaydi. Hardware memory tagging eski pointer tagini yangi allocationdan farqlashi mumkin. Hech biri barcha timingni kafolatlamaydi.
Test
Test scope exit, reallocation, concurrent free va callback lifetime’ni qamraydi. Fuzzer ownership transitionlarni o‘zgartirib sanitizer ostida ishlaydi.
Amaliy nazorat
Dangling Pointer bilan ishlaydigan tizim allocation identity va lifetimeni 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 — use-after-free yoki reallocation invalidation. 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 ASan, concurrent free va callback 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.
Dangling pointer qiymati ko‘pincha null bo‘lmaydi va shu sabab oddiy null checkdan o‘tadi. Allocator bo‘shatilgan blokni boshqa obyektga bersa, eski pointer orqali yozish yangi obyektni jim buzadi; crash ancha keyin yuz berishi mumkin. Container reallocationi element manzili va iteratorlarni invalid qilishi ham shu sinfga kiradi. Ownershipni unique_ptr, borrow qoidalari yoki handle-generation jufti bilan ifodalash xavfni kamaytiradi. AddressSanitizer freed hudud atrofida redzone va quarantine qo‘llab use-after-free’ni aniqlaydi, ammo productiondagi barcha timing va reuse kombinatsiyalarini to‘liq isbotlamaydi.
Callback yoki asynchronous ish obyekt egasidan uzoq yashasa, lifetime contract reference counting, cancellation va join orqali aniq bog‘lanadi.
Bog‘liq tushunchalar
use-after-free, object lifetime, memory safety, smart pointer, iterator invalidation, AddressSanitizer