ذاكرة مهيأة صفرية

تعد الذاكرة غير المهيأة في C وC++ سببًا شائعًا لمشاكل الموثوقية وأخطاء سلامة الذاكرة وتسرب المعلومات. لتجنب هذه المشكلات، يقوم Android بتهيئة أكبر قدر ممكن من الذاكرة.

ذاكرة مساحة المستخدم التي تمت تهيئتها صفر

منذ Android 12، لم تتم تهيئة ذاكرة المكدس في جميع التعليمات البرمجية الأصلية للنظام الأساسي (بما في ذلك JNI) ولم تتم تهيئة ذاكرة الكومة في جميع العمليات الأصلية للنظام الأساسي (مثل netd ) ولكن ليس في zygote أو في التطبيقات.

يُنصح بشدة باستخدام تطبيقات الطرف الأول وتطبيقات الطرف الثالث التي تم إنشاؤها باستخدام NDK لاستخدام علامة المترجم -ftrivial-auto-var-init=zero للتهيئة الصفرية لمتغيرات المكدس المحلية الخاصة بها. يقوم المترجم بتحسين أي عملية تصفير غير ضرورية. على سبيل المثال، عندما تتم تهيئة متغير محلي بشكل صريح (مثل int x = 123; تتم تهيئة المتغير x مرة واحدة فقط). إذا كان البرنامج يحتوي على مخزن مؤقت كبير للمكدس في نقطة اتصال الأداء، فيمكن للمطور تعطيل التهيئة باستخدام سمة المترجم:

__attribute__((__uninitialized__)) char buf[BUFSIZ];

يمكن للتطبيقات أيضًا الاشتراك في عملية التهيئة الصفرية باستخدام سمة البيان android:nativeHeapZeroInitialized . وبدلاً من ذلك، يمكن التحكم في تهيئة الكومة الصفرية في وقت التشغيل باستخدام:

int mallopt(M_BIONIC_ZERO_INIT, level)

حيث المستوى 0 أو 1.

ذاكرة النواة التي تمت تهيئتها صفر

تمت تهيئة مكدس وكومة kernel صفرًا لنواة GKI، وهو ما يوصى به بشدة CDD .

لتهيئة المكدس، يستخدم GKI تكوين CONFIG_INIT_STACK_ALL_ZERO ، مما يؤدي إلى بناء النواة باستخدام علامة المترجم -ftrivial-auto-var-init=zero . لتهيئة الكومة، يستخدم GKI CONFIG_INIT_ON_ALLOC_DEFAULT_ON ، مما يجعل كل كومة الصفحة وتخصيصات SLAB وSLUB بدون تهيئة عند إنشائها. يشبه هذا الخيار بشكل فعال تمرير init_on_alloc=1 كخيار وقت تشغيل kernel.

تقارير الأخطاء

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

مثال لتقرير خطأ تم إنشاؤه بواسطة أداة أمان الذاكرة
الشكل 1 : تقارير الأخطاء التي تم إنشاؤها بواسطة أدوات أمان الذاكرة

أثناء التطوير، يجب على البائعين مراقبة وجود الأخطاء عن طريق التحقق من /data/tombstones و logcat بحثًا عن الأعطال الأصلية. لمزيد من المعلومات حول تصحيح أخطاء التعليمات البرمجية الأصلية لنظام Android، راجع المعلومات هنا .