Bosh sahifa Wiki Out-of-Bounds Access

Out-of-Bounds Access

Out-of-Bounds Accessarray, 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