आउट ऑफ बाउंड्स क्या है?
यदि सरणी का आकार n है, तो वैध सूचकांक 0 से n-1 तक होते हैं। इस सीमा से बाहर किसी सूचकांक को एक्सेस करना "आउट ऑफ बाउंड्स" कहलाता है।
व्यवहार
- कंपाइलर आमतौर पर त्रुटि नहीं देता (C बाउंड्स चेक नहीं करता)।
- प्रोग्राम कंपाइल और रन हो जाता है।
- परिणाम अनिश्चित (Undefined Behavior - UB) होता है:
-
li>कचरा मान पढ़ना
li>अन्य चर को भ्रष्ट करना
li>प्रोग्राम क्रैश (सेगफॉल्ट)
li>सुरक्षा भेद्यता (बफर ओवरफ्लो)
उदाहरण प्रोग्राम
#include <stdio.h>
int main() {
int std[4]; // आकार 4: वैध सूचकांक 0,1,2,3
int i;
std[0] = 100; // वैध
std[1] = 200; // वैध
std[2] = 300; // वैध
std[3] = 400; // वैध
std[4] = 500; // ❌ आउट ऑफ बाउंड्स!
printf("सभी तत्व प्रिंट (0 से 4 तक):\n");
for (i = 0; i < 5; i++)
printf("std[%d] = %d\n", i, std[i]);
return 0;
}
संभावित आउटपुट
std[0] = 100 std[1] = 200 std[2] = 300 std[3] = 400 std[4] = 2314 ← कचरा मान (500 नहीं!)
व्याख्या
std[4] सरणी की सीमा से बाहर है। कंपाइलर ने इसे नहीं रोका। मान 500 असाइन हुआ लेकिन प्रिंट 2314 आया क्योंकि:
- वह मेमोरी किसी अन्य चर/डेटा का हिस्सा हो सकती है।
- कंपाइलर ऑप्टिमाइजेशन के कारण स्टोर ऑप्टिमाइज़ हो गया हो।
- स्टैक लेआउट के कारण ओवरलैप।
आउट ऑफ बाउंड्स के प्रकार
| प्रकार | उदाहरण | परिणाम |
|---|---|---|
| पढ़ना | x = arr[10]; | कचरा मान, संभावित क्रैश |
| लिखना | arr[10] = 5; | मेमोरी भ्रष्टाचार, सुरक्षा छेद |
| पॉइंटर अंकगणित | *(arr + 10) | समान UB |
पता लगाने के उपकरण
🔍 डिबगिंग टूल्स
- AddressSanitizer (ASan):
gcc -fsanitize=address -g- रनटाइम पर पकड़ता है - Valgrind:
valgrind ./program- मेमोरी त्रुटियाँ ढूंढता है - Static Analysis:
cppcheck --enable=all,clang-tidy - Compiler Warnings:
-Wall -Warray-bounds(सीमित)
रोकथाम के तरीके
// 1. स्थिर सरणी: आकार स्थिरांक में रखें
#define SIZE 10
int arr[SIZE];
for (int i = 0; i < SIZE; i++) ...
// 2. डायनामिक: आकार वेरिएबल में रखें
int *arr = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) ...
// 3. फंक्शन में आकार पास करें
void process(int *arr, int size) { ... }
// 4. एसर्टन उपयोग करें (डिबग बिल्ड)
assert(index >= 0 && index < size);
// 5. C11: एनोटेशन (कंपाइलर सहायता)
void func(int arr[static 10]); // कम से कम 10 तत्व
सुरक्षा निहितार्थ
बफर ओवरफ्लो (आउट ऑफ बाउंड्स लिखना) सबसे आम सुरक्षा भेद्यता है। इससे हमलावर मनमाना कोड निष्पादित कर सकते हैं। आधुनिक सुरक्षा: Stack Canaries, ASLR, DEP, बाउंड्स चेकिंग कंपाइलर (Hardened GCC/Clang)।