Out-of-Bounds Access — array, buffer yoki obyekt uchun ruxsat etilgan indeks yoki byte diapazonidan tashqarida o‘qish yoki yozish amali.
Chegara xatolari
Off-by-one i <= length kabi shartdan keladi. Pastki manfiy indeks signed/unsigned conversionda juda katta qiymatga aylanishi mumkin. offset + size overflow checkni aldashi ehtimol.
Oqibat
Read maxfiy qo‘shni ma’lumotni oshkor qiladi yoki fault beradi; write boshqa obyekt, control data yoki allocator metadata’sini buzadi. Xato deterministic ko‘rinmasligi mumkin.
Pointer qoidasi
C/C++ pointer arithmetic faqat bitta array obyekt chegarasi va one-past qiymat qoidalariga ega. One-past pointer taqqoslash uchun bo‘lishi mumkin, dereference qilinmaydi.
Runtime check
Bounds-checked til runtime exception beradi. Optimizer range analysis orqali isbotlangan checkni olib tashlaydi. FFI va unsafe block boundaryni qayta tekshirishi kerak.
Aniqlash
Canary faqat ayrim stack overwrite’ni topadi. ASan redzone, hardware memory tagging va capability bound kuchliroq yordam beradi. Static analyzer input-derived lengthni kuzatadi.
Test
Test 0, length-1, length, -1, maksimal size, arithmetic overflow va multi-dimensional stride’ni qamraydi. Fuzzer length/offset kombinatsiyalarini o‘zgartiradi.
Amaliy nazorat
Out-of-Bounds Access bilan ishlaydigan tizim base, length, offset va arithmeticni 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 — off-by-one yoki size overflow. 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 boundary, negative va max-size 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.
Bir-past-the-end pointer C va C++da iteratsiya chegarasi sifatida hosil qilinishi mumkin, ammo uni dereference qilish mumkin emas. Ko‘p xatolar uzunlikni element soni va bayt soni o‘rtasida adashtirish, signed qiymatni unsignedga aylantirish yoki <= bilan ortiqcha iteratsiyadan keladi. O‘qish maxfiy ma’lumotni oshkor qilishi, yozish esa control data yoki qo‘shni obyektni buzishi mumkin. Bounds-checking mavjud tillarda ham unsafe blok, native extension yoki noto‘g‘ri indeks arifmetikasi xavf tug‘diradi. Testlar nol element, maksimal uzunlik, overflow qiluvchi ko‘paytma va subspan chegaralarini qamraydi.
Ikki o‘lchamli massivda stride va row length aralashsa indeks umumiy buffer ichida qolib, baribir mantiqan begona qatorga tegishi mumkin.
Bog‘liq tushunchalar
buffer overflow, bounds checking, array index, memory safety, AddressSanitizer, integer overflow