אפס זיכרון מאותחל

זיכרון לא מאותחל ב-C ו-C++ הוא גורם שכיח לבעיות אמינות, באגי בטיחות בזיכרון ודליפות מידע. כדי להימנע מבעיות אלה, אנדרואיד מאתחל כמה שיותר זיכרון.

אפס זיכרון מרחב משתמש מאותחל

מאז אנדרואיד 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.

אפס זיכרון ליבה מאותחל

ערימת הליבה וה-heap מאותחלים לאפס עבור גרעיני 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 כאפשרות של זמן אתחול ליבה.

דיווחי שגיאות

הכלים שלנו מייצרים דוחות באגים בעלי תובנות המכילים מידע נוסף כדי לסייע בניפוי באגים. עקבות ההקצאה וההקצאה הנוספת עוזרות להבין טוב יותר את מחזור החיים של הקצאה נתונה ומובילה לבאגים בטיחותיים גורמי שורש הרבה יותר מהר.

דוגמה לדוח באג שנוצר על ידי כלי בטיחות זיכרון
איור 1 : דוחות באגים שנוצרו על ידי כלי בטיחות זיכרון

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