0Pricing
C++ Academy · درس

AddressSanitizer

اكتشف أخطاء الذاكرة

AddressSanitizer درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما هو AddressSanitizer؟

إن AddressSanitizer (ASan) أداة تعتمد على المصرّف وتكتشف أخطاء الذاكرة أثناء التشغيل، مثل الوصول خارج الحدود، واستخدام الذاكرة بعد تحريرها، والتحرير المزدوج، وتسربات الذاكرة. وهي سريعة بما يكفي للاختبارات اليومية.

تفعيل ASan

أضف -fsanitize=address أثناء الترجمة والربط معًا، وأضف -g للحصول على تقارير واضحة.

g++ -fsanitize=address -g -O1 main.cpp -o app
./app

تجاوز سعة مخزن الذاكرة في الكومة

يرصد ASan عمليات القراءة والكتابة التي تتجاوز مخزنًا محجوزًا. يكتب هذا البرنامج عنصرًا إضافيًا بعد نهاية المخزن.

#include <cstdlib>

int main() {
    int* a = (int*)malloc(3 * sizeof(int));
    a[3] = 7; // out of bounds
    free(a);
    return 0;
}

استخدام الذاكرة بعد تحريرها

يُعد الوصول إلى الذاكرة بعد تحريرها سلوكًا غير معرّف؛ ويصدر ASan تقريرًا عن heap-use-after-free يتضمن مكدسي الاستدعاءات اللذين يوضحان موضع التحرير وموضع الحجز.

#include <cstdlib>

int main() {
    int* p = (int*)malloc(sizeof(int));
    free(p);
    *p = 5; // use after free
    return 0;
}

تجاوز سعة مخزن الذاكرة في المكدس

يُجري ASan أيضًا أدوات فحص على مصفوفات المكدس، فيكتشف تجاوزات مخازن الذاكرة المحلية.

#include <iostream>

int main() {
    int buf[3] = {0, 0, 0};
    for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
    std::cout << buf[0] << "\n";
    return 0;
}

قراءة التقرير

يسمي تقرير ASan نوع الخطأ والعنوان المتسبب فيه، ويعرض تتبعات مكدس الاستدعاءات للوصول الخاطئ، إضافةً إلى عمليات الحجز والتحرير ذات الصلة. ويشير أول إطار في المكدس عادةً مباشرةً إلى موضع الخطأ.

اكتشاف التسربات

يتضمن ASan أداة LeakSanitizer في العديد من المنصات، وهي ترصد الذاكرة التي لم تُحرر عند خروج البرنامج، مع عرض مكدس الاستدعاءات الذي يوضح موضع حجزها.

#include <cstdlib>

int main() {
    int* leaked = (int*)malloc(100); // never freed
    return 0;
}

خيارات وقت التشغيل

اضبط السلوك باستخدام متغير البيئة ASAN_OPTIONS، مثل ASAN_OPTIONS=detect_leaks=1:halt_on_error=0.

تكلفة الأداء

يؤدي ASan عادةً إلى إبطاء البرامج بمقدار الضعف تقريبًا ويزيد من استهلاك الذاكرة. وهذا مقبول للاختبارات وCI، لكن لا ينبغي شحن إصدار نهائي مفعّل فيه ASan.

دمجه مع الاختبارات

شغّل اختبارات الوحدة باستخدام ASan ضمن CI. فالعديد من الأخطاء الحقيقية لا تظهر إلا عند اختبارها باستخدام أدوات فحص الذاكرة. واحتفظ بإعداد مخصص لإنشاء إصدارات أدوات الفحص.

ليس بديلًا عن الحرص

يكتشف ASan الأخطاء في مسارات الشفرة التي تنفذها فعليًا فقط. لذلك استخدمه مع تغطية اختبار جيدة؛ إذ يظل فرع معيب لم يُنفذ مخفيًا.

تحقق سريع

تذكّر كيفية تفعيل ASan.

مراجعة

لقد تعلّمتم AddressSanitizer.

  • يكتشف الوصول خارج الحدود، واستخدام الذاكرة بعد تحريرها، والتحرير المزدوج، وتسربات الذاكرة
  • فعّلوه باستخدام -fsanitize=address -g
  • تسمي التقارير الخطأ وتعرض مكدسات الاستدعاءات الخاصة بالحجز والتحرير
  • أبطأ بنحو الضعف؛ وهو مثالي للاختبارات وCI، وليس للإصدارات النهائية

الأسئلة الشائعة

هل درس «AddressSanitizer» مجاني؟

نعم — نص درس «AddressSanitizer» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «AddressSanitizer»؟

اكتشف أخطاء الذاكرة تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «AddressSanitizer»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. استخدام gdb وlldb
  2. AddressSanitizer
  3. UBSan وTSan
  4. أساسيات Valgrind
← العودة إلى C++ Academy