AddressSanitizer C++: पूरी गाइड उदाहरणों के साथ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

AddressSanitizer for C++: मेमोरी एरर पकड़ने की पूरी गाइड

1. यह क्या है और क्यों ज़रूरी है

AddressSanitizer (ASan) कोई सामान्य लाइब्रेरी नहीं, बल्कि Clang और GCC कंपाइलरों में बिल्ट-इन एक शक्तिशाली डायनामिक कोड एनालिसिस टूल है। यह प्रोग्राम चलने के दौरान मेमोरी से जुड़ी गलतियों को पकड़ता है। Google द्वारा डेवलप किया गया ASan, buffer overflow, use-after-free, double-free और memory leaks जैसी खतरनाक गलतियों को खोजने का स्टैंडर्ड बन चुका है।

यह क्यों ज़रूरी है? C++ में मेमोरी की गलतियाँ सबसे खतरनाक होती हैं। ये सालों तक छिपी रह सकती हैं, फिर अचानक क्रैश, डेटा करप्शन या सिक्योरिटी वल्नरेबिलिटी का कारण बनती हैं। पारंपरिक डीबगर अक्सर बेकार होते हैं क्योंकि प्रोग्राम असली गलती से दूर कहीं और क्रैश होता है। ASan कंपाइलेशन के समय कोड में चेक जोड़कर यह समस्या हल करता है: हर मेमोरी ऑपरेशन (malloc, new, free, delete, pointer read/write) के आसपास जाँच करता है। कोई गड़बड़ी मिलते ही प्रोग्राम रुक जाता है और सटीक लाइन नंबर, एरर टाइप और स्टैक ट्रेस दिखाता है।

PythonLib जैसी एजुकेशनल साइट के लिए: Python मेमोरी खुद मैनेज करता है, लेकिन ASan उन C++ डेवलपर्स के लिए बहुत उपयोगी है जो हाई-लोड या सिक्योरिटी-क्रिटिकल ऐप बनाते हैं। ASan को CI/CD पाइपलाइन में जोड़कर प्रोडक्शन में जाने से पहले बग पकड़े जा सकते हैं। यह Linux, macOS, Windows और FreeBSD पर काम करता है, और C, C++, Objective-C को सपोर्ट करता है।

2. इंस्टॉलेशन

AddressSanitizer अलग से इंस्टॉल नहीं होता — यह कंपाइलर का हिस्सा है। आपको Clang (वर्जन 3.1+) या GCC (वर्जन 4.8+) चाहिए।

कंपाइलर इंस्टॉल करना (Ubuntu/Debian के लिए):

sudo apt update
sudo apt install clang-14  # या g++-11

macOS के लिए: Xcode Command Line Tools में Clang ASan के साथ आता है।

xcode-select --install

Windows के लिए: Visual Studio 2019+ इस्तेमाल करें (फ्लैग /fsanitize=address चालू करें) या LLVM से Clang इंस्टॉल करें।

सपोर्ट चेक करें:

clang++ -fsanitize=address --version
g++ -fsanitize=address --version

3. तुरंत शुरुआत — सबसे छोटा काम का उदाहरण

example.cpp फ़ाइल बनाएँ जिसमें जानबूझकर गलती हो (use-after-free):

#include <iostream>

int main() {
    int* p = new int(42);
    delete p;
    std::cout << *p << std::endl;  // गलती: use-after-free
    return 0;
}

ASan के साथ कंपाइल और रन करें:

clang++ -fsanitize=address -g -o example example.cpp
./example

आपको लाइन नंबर, एरर टाइप और कॉल स्टैक के साथ एक विस्तृत रिपोर्ट दिखेगी। ASan के बिना प्रोग्राम 42 प्रिंट कर सकता था या segmentation fault से क्रैश हो सकता था।

4. मुख्य तरीके/फंक्शन/क्लास

AddressSanitizer कोड से कॉल करने के लिए कोई API नहीं देता — यह ऑटोमैटिक काम करता है। हालांकि, बारीक सेटिंग और इंटीग्रेशन के लिए कुछ हेल्पर मैक्रोज़ और फंक्शन हैं। आइए 8 मुख्य तत्व देखें।

4.1. __asan_address_is_poisoned()

सिग्नेचर: int __asan_address_is_poisoned(void const *addr);

क्या करता है: जाँचता है कि मेमोरी एरिया "पॉइज़न्ड" (अनुपलब्ध) है या नहीं। अगर एड्रेस पॉइज़न्ड ज़ोन में है तो 1 लौटाता है, वरना 0।

उदाहरण:

#include <sanitizer/asan_interface.h>
#include <iostream>

int main() {
    int* arr = new int[10];
    arr[5] = 100;
    // चेक करें कि क्या arr+10 (ऐरे के बाहर) पॉइज़न्ड है
    if (__asan_address_is_poisoned(arr + 10)) {
        st                    

अनुशंसाएँ