זיכרון לא מאתחל ב-C וב-C++ הוא סיבה נפוצה לבעיות אמינות, באגים הקשורים לבטיחות זיכרון ודליפות מידע. כדי למנוע את הבעיות האלה, Android מפעיל כמה שיותר זיכרון.
ללא זיכרון מרחב משתמש מאותחל
החל מ-Android 12, הזיכרון של המקבץ לא הופעל
בכל קוד ה-Native של הפלטפורמה (כולל JNI) והזיכרון של הזיכרון הוא אפס
הופעל בכל תהליכי הנייטיב של הפלטפורמה (כמו netd
)
אבל לא ב-zygote
או באפליקציות.
לאפליקציות של צד ראשון ושל צד שלישי שפותחו באמצעות NDK
מומלץ להשתמש בדגל המהדר -ftrivial-auto-var-init=zero
כדי לאפס את אתחול הערימה המקומית
משתנים. המהדר מבצע אופטימיזציה של כל איפוס שאין בו צורך.
לדוגמה, כשמשתנה מקומי מאותחל באופן מפורש
(לדוגמה, משתנה int x = 123;
x
מאותחל רק פעם אחת).
אם לתוכנית יש מאגר נתונים זמני של סטאק בביצועים
נקודה לשיתוף אינטרנט, המפתח יכול להשבית אתחול באמצעות מהדר (compiler)
:
__attribute__((__uninitialized__)) char buf[BUFSIZ];
אפליקציות יכולות להביע הסכמה לאתחול ערימה (heap0) גם באמצעות
מאפיין מניפסט android:nativeHeapZeroInitialized
.
לחלופין, אפשר לשלוט באתחול של אפס הזיכרון בזמן הריצה
עם:
int mallopt(M_BIONIC_ZERO_INIT, level)
כאשר הרמה היא 0 או 1.
ללא זיכרון ליבה (kernel) מאותחל
סטאק הליבה (kernel) והערימה (heap) מאותחלים עבור ליבות של GKI, וזהו שמומלצת על ידי ה-CDD.
לאתחול סטאק, GKI משתמש
ההגדרה של CONFIG_INIT_STACK_ALL_ZERO
, שהתוצאה שלה היא
ליבה (kernel) באמצעות דגל המהדר -ftrivial-auto-var-init=zero
.
לאתחול ערימה, GKI משתמש בפונקציה של
CONFIG_INIT_ON_ALLOC_DEFAULT_ON
, שהופך את כל הדפים לערימה (SLAB)
והקצאות SLUB ללא אתחול בזמן היצירה שלהן. האפשרות הזאת היא
דומה להעברת init_on_alloc=1
בתור ליבה
במצב של זמן אתחול.
דוחות איתור באגים
הכלים שלנו מפיקים דוחות שימושיים על באגים שמכילים מידע נוסף כדי לסייע בניפוי באגים. דוח הקריסות הנוסף של הקצאות ומיקום עסקה עוזרות להבין טוב יותר את מחזור החיים של הקצאה נתונה ומובילים באגים של אבטחת זיכרון שגורמים לשורש הבעיה הרבה יותר מהר.
במהלך הפיתוח, הספקים צריכים לעקוב אחרי נוכחות של באגים באמצעות בדיקה של
/data/tombstones
והקבוצה
logcat
לקריסות מקוריות. מידע נוסף על
מידע על ניפוי באגים בקוד מקורי של Android זמין כאן.