تصحيح أخطاء الذاكرة والحدّ منها

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

tl;dr

لغات آمنة من حيث إدارة الذاكرة

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

اللغتان المتوافقتان رسميًا مع Android واللتان توفّران أمانًا للذاكرة هما Java وKotlin. ويكون تطوير معظم تطبيقات Android أسهل باستخدام إحدى هاتين اللغتَين.

مع ذلك، هناك مطوّرو تطبيقات يرسلون رمزًا مكتوبًا بلغة Rust، وإذا كنت تقرأ هذه الصفحة، من المحتمل أنّ لديك سببًا وجيهًا لاستخدام الرمز البرمجي الأصلي (إمكانية النقل أو الأداء أو كليهما). ‫Rust هي الخيار الأفضل للرمز البرمجي الأصلي الآمن للذاكرة على Android. قد لا يتمكّن فريق NDK من مساعدتك في حل المشاكل التي تواجهها إذا اخترت هذا المسار، ولكننا مهتمون بالاستماع إلى ملاحظاتك.

PAC/BTI

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

وتتوافق هذه الميزات مع الأجهزة القديمة التي لا تتوافق معها، لأنّ التعليمات الجديدة المستخدَمة لا تؤدي أي وظيفة على الأجهزة القديمة. ويجب أيضًا أن يكون لديك إصدار حديث من النواة وإصدار حديث من نظام التشغيل. يساعدك البحث عن paca وbti في /proc/cpuinfo في معرفة ما إذا كان لديك جهاز جديد بما يكفي ونواة جديدة بما يكفي. يتضمّن نظام التشغيل Android 12 (المستوى 31 من واجهة برمجة التطبيقات) دعمًا ضروريًا لمساحة المستخدم.

الإيجابيات:

  • يمكن تفعيلها في جميع الإصدارات بدون التسبّب في حدوث مشاكل على الأجهزة أو النواة القديمة (ولكن تأكَّد من أنّك اختبرتها فعليًا على جهاز/نواة/نظام تشغيل يتوافق معها).

السلبيات:

  • متاح فقط لتطبيقات 64 بت
  • لا يقلّل من الأخطاء على الأجهزة التي لا تتوافق معه
  • زيادة في حجم الرمز بنسبة% 1

GWP-Asan

يمكن استخدام GWP-ASan لرصد أخطاء الذاكرة في المجال، ولكن معدّل أخذ العينات منخفض جدًا بحيث لا يمكن أن يكون وسيلة فعّالة للحدّ من هذه الأخطاء.

الإيجابيات:

  • لا يوجد حمل كبير على وحدة المعالجة المركزية أو الذاكرة
  • سهولة النشر: لا يتطلّب إعادة إنشاء الرمز البرمجي الأصلي
  • تعمل مع تطبيقات 32 بت

السلبيات:

  • يتطلّب معدّل أخذ العيّنات المنخفض عددًا كبيرًا من المستخدمين للعثور على الأخطاء بفعالية
  • لا يرصد سوى أخطاء الذاكرة المؤقتة، وليس أخطاء الذاكرة المخصّصة

HWASan

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

الإيجابيات:

  • ما مِن نتائج إيجابية خاطئة
  • يرصد فئات إضافية من الأخطاء التي لا يمكن لـ ASan رصدها (استخدام الذاكرة المخصّصة في المكدّس بعد إرجاعها)
  • معدّل أقل للحالات السلبية الخاطئة مقارنةً بـ MTE (حالة واحدة من 256 حالة مقابل حالة واحدة من 16 حالة)
  • استخدام ذاكرة أقل من ASan، وهو البديل الأقرب

السلبيات:

  • زيادة كبيرة في استخدام وحدة المعالجة المركزية (حوالي ‎100%) وحجم الرمز البرمجي (حوالي ‎50%) والذاكرة (من ‎10% إلى ‎35%)
  • حتى الإصدار 34 من واجهة برمجة التطبيقات وNDK r26، يتطلّب ذلك تثبيت صورة متوافقة مع HWASan
  • تعمل هذه الميزة على تطبيقات 64 بت فقط

MTE

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

الإيجابيات:

  • تكلفة إضافية منخفضة بما يكفي لتكون مقبولة في الإصدار العلني للعديد من التطبيقات
  • ما مِن نتائج إيجابية خاطئة
  • لا يتطلّب إعادة إنشاء الرمز البرمجي لرصد أخطاء الذاكرة المؤقتة (ولكنّه يتطلّب ذلك لرصد أخطاء الذاكرة المكدّسة)

السلبيات:

  • لا تتوفّر أي أجهزة تجارية مزوّدة بميزة MTE مفعَّلة تلقائيًا في عام 2024، ولكن يوضّح مستند Arm كيفية تفعيل ميزة MTE لاختبارها على هواتف Pixel 8 وPixel 8 Pro.
  • معدّل النتائج السلبية الخاطئة هو 1 من 16 مقارنةً بمعدّل 1 من 256 في HWASan
  • متاح فقط لتطبيقات 64 بت
  • يتطلّب ذلك إنشاء مكتبات منفصلة لاستهداف الأجهزة التي تم تفعيل إضافة وضع علامات الذاكرة (MTE) عليها والأجهزة التي لم يتم تفعيلها عليها

ASan

Address sanitizer، المعروفة أيضًا باسم ASan، هي الأداة الأقدم والأكثر توفّرًا من بين الأدوات المتاحة. وهي مفيدة في رصد أخطاء الذاكرة أثناء الاختبار وتصحيح الأخطاء التي تؤثر فقط في الأجهزة القديمة التي لا تتوفّر فيها أي من الأدوات الأخرى. استخدام HWASan كلما أمكن ذلك

الإيجابيات:

  • متاحة على نطاق واسع قد يعمل على الأجهزة القديمة التي تعمل بإصدار KitKat
  • لا يتم تسجيل نتائج إيجابية أو سلبية خاطئة عند استخدامها بشكل صحيح

السلبيات:

  • صعوبة إنشاء الحزمة وتغليفها بشكل صحيح
  • أعلى تكلفة إضافية بين جميع الخيارات: %100 تقريبًا من وحدة المعالجة المركزية، و% 50 تقريبًا من حجم الرمز، و% 100 تقريبًا من استخدام الذاكرة
  • لم يعُد متاحًا
  • يحتوي على أخطاء معروفة لن يتم إصلاحها