C++ Academy · درس

Sanitizers: ‏Address وThread وUB Sanitizer

اكتشف أخطاء الذاكرة والخيوط والسلوك غير المعرّف باستخدام عائلة Sanitizers.

الدرس 2 من 415 خطوة

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

أدوات الفحص وقت التشغيل

أدوات التعقيم هي أدوات فحص وقت التشغيل التي تُضاف إليها وسائل القياس أثناء الترجمة، وهي مدمجة في Clang وGCC. وتكتشف أخطاء لا يستطيع نظام الأنواع اكتشافها.

AddressSanitizer (ASan)

يكتشف أخطاء الذاكرة، مثل تجاوزات المخازن المؤقتة، واستخدام الذاكرة بعد تحريرها، والتحرير المزدوج، والتسرّبات. ويبلغ التباطؤ نحو الضعف.

g++ -fsanitize=address -g -O1 main.cpp
./a.out

مثال على مخرجات ASan

عندما يكتشف ASan خطأً، يطبع أثرًا للمكدس يتضمن السطر الدقيق ونوع الخطأ.

==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
    #0 0x... in main main.cpp:12

ThreadSanitizer (TSan)

يكشف حالات تسابق البيانات وغيرها من أخطاء التزامن. تباطؤ بنحو 5 إلى 15 ضعفًا.

g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accesses

Undefined Behavior Sanitizer (UBSan)

يكتشف فيض الأعداد الصحيحة الموقّعة، وإلغاء الإشارة إلى مؤشر فارغ، والوصول غير المحاذي، والقسمة على صفر، وغير ذلك.

g++ -fsanitize=undefined -g main.cpp

MemorySanitizer (MSan)

يكتشف عمليات القراءة من ذاكرة غير مهيّأة. وهو متاح في Clang فقط، ويتطلب بناء البرنامج بأكمله، بما في ذلك المكتبات، باستخدام MSan.

LeakSanitizer

يأتي مضمّنًا مع ASan على Linux. ويبلغ عن الذاكرة التي لا تزال مخصّصة عند الخروج.

ASAN_OPTIONS=detect_leaks=1 ./a.out

أدوات التعقيم ليست مجانية

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

لا يمكن الجمع بينها جميعًا

لا يمكن استخدام ASan وTSan وMSan معًا، لأنها تضيف وسائل قياس مختلفة للذاكرة. ويمكن دمج UBSan مع الأدوات الأخرى.

دعم المصرّفات

يدعم GCC‏ ASan وTSan وUBSan. ويدعم Clang جميع الأدوات المذكورة أعلاه، بالإضافة إلى MSan. وتكون الخيارات متطابقة في المصرّفين.

التكامل المستمر

شغّل مجموعة اختباراتك باستخدام كل أداة تعقيم في التكامل المستمر. اكتشف حالات التنافس وأخطاء الذاكرة قبل شحن البرنامج. ولأفضل تغطية، ادمج ذلك مع الاختبار العشوائي.

نصيحة: ابنِ باستخدام -O1

استخدم مستوى تحسين لا يقل عن -O1 عند البناء لأدوات التعقيم. يعمل -O0 أيضًا، لكنه يضمّن عددًا أقل من الدوال، مما يجعل آثار المكدس أقل إفادة.

ملفات الحجب

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

ASAN_OPTIONS="suppressions=asan.supp" ./a.out

تحقق سريع

أي أداة تعقيم تكتشف حالات التنافس على البيانات بين الخيوط؟

مراجعة سريعة

تكتشف أدوات التعقيم أخطاء حقيقية أثناء وقت التشغيل: يستخدم AddressSanitizer لأخطاء الذاكرة، وThreadSanitizer لحالات التنافس، وUBSan للسلوك غير المعرّف، وMSan لعمليات القراءة من الذاكرة غير المهيّأة. ادمجها مع مجموعة اختباراتك في التكامل المستمر لتحقيق مكاسب كبيرة في الأمان.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

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

هل درس «Sanitizers: ‏Address وThread وUB Sanitizer» مجاني؟

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

ماذا ستتعلم في «Sanitizers: ‏Address وThread وUB Sanitizer»؟

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

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

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

كم من الوقت يستغرق درس «Sanitizers: ‏Address وThread وUB Sanitizer»؟

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

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

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

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

  1. أدوات التحليل الساكن: clang-tidy وcppcheck
  2. Sanitizers: ‏Address وThread وUB Sanitizer
  3. اختبار Fuzzing باستخدام libFuzzer
  4. التكامل المستمر لمشاريع C++
← العودة إلى C++ Academy