זיכרון לא מיושר ב-C וב-C++ הוא גורם נפוץ לבעיות מהימנות, באגים של בטיחות זיכרון ודליפות מידע. כדי למנוע את הבעיות האלה, Android מאתחלת כמה שיותר זיכרון.
זיכרון של מרחב משתמש שהוגדר לאפס
החל מ-Android 12, זיכרון הערימה מוגדר לאפס בכל הקוד המקורי של הפלטפורמה (כולל JNI), וזיכרון הערימה מוגדר לאפס בכל התהליכים המקומיים של הפלטפורמה (כמו netd
), אבל לא ב-zygote
או באפליקציות.
מומלץ מאוד להשתמש בדגל המהדרר -ftrivial-auto-var-init=zero
באפליקציות מבית ובאפליקציות של צד שלישי שנוצרו באמצעות NDK, כדי לאפס את המשתנים המקומיים בסטאק. המהדר מבצע אופטימיזציה כדי להסיר כל אפסה מיותרת.
לדוגמה, כשמשתנה מקומי מופעל באופן מפורש (למשל, המשתנה int x = 123;
x
מופעל רק פעם אחת).
אם לתוכנית יש מאגר גדול של סטאק בנקודת חם לביצועים, המפתח יכול להשבית את האינטוליזציה באמצעות מאפיין של המהדר:
__attribute__((__uninitialized__)) char buf[BUFSIZ];
אפליקציות יכולות גם להביע הסכמה להפעלת האפס של אשכול באמצעות מאפיין המניפסט android:nativeHeapZeroInitialized
.
לחלופין, אפשר לשלוט ב-heap zero initialization בזמן הריצה באמצעות:
int mallopt(M_BIONIC_ZERO_INIT, level)
כאשר level הוא 0 או 1.
זיכרון ליבה שהוגדר לאפס
סטאק הליבה והמקבץ ממוּתנים באפס עבור ליבות 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
כאפשרות של הליבה בזמן האתחול.
דוחות איתור באגים
הכלים שלנו יוצרים דוחות באגים מועילים שמכילים מידע נוסף שעוזר לנפות באגים. מעקב הסטאק הנוסף של ההקצאה והביטול עוזר להבין טוב יותר את מחזור החיים של הקצאה מסוימת, ומאפשר להגיע מהר יותר לבאגים בטיחותיים בזיכרון שמקורם בבעיה ברמה הבסיסית.

במהלך הפיתוח, ספקים צריכים לעקוב אחר נוכחות באגים על ידי בדיקה של /data/tombstones
ו-logcat
לצורך איתור קריסות מקוריות. מידע נוסף על ניפוי באגים בקוד מקורי ל-Android זמין כאן.