حافظه اولیه در C و C++ یکی از دلایل رایج مشکلات قابلیت اطمینان، اشکالات ایمنی حافظه و نشت اطلاعات است. برای جلوگیری از این مشکلات، اندروید تا حد ممکن حافظه را مقداردهی اولیه می کند.
حافظه فضای کاربری اولیه صفر
از اندروید 12، حافظه پشته در تمام کدهای بومی پلتفرم (از جمله JNI) صفر است و حافظه پشته در تمام فرآیندهای بومی پلتفرم (مانند netd
) صفر است، اما در zygote
یا در برنامهها صفر است.
برنامه های شخص اول و شخص ثالث ساخته شده با NDK اکیداً توصیه می شود از پرچم کامپایلر -ftrivial-auto-var-init=zero
برای صفر کردن متغیرهای محلی پشته خود استفاده کنند. کامپایلر هرگونه صفر کردن غیر ضروری را بهینه می کند. به عنوان مثال، زمانی که یک متغیر محلی به طور صریح مقداردهی اولیه می شود (مانند، int x = 123;
متغیر x
تنها یک بار مقداردهی اولیه می شود). اگر برنامه دارای یک بافر پشته بزرگ در یک نقطه عملکردی باشد، توسعه دهنده می تواند با استفاده از یک ویژگی کامپایلر، مقداردهی اولیه را غیرفعال کند:
__attribute__((__uninitialized__)) char buf[BUFSIZ];
برنامهها همچنین میتوانند با استفاده از ویژگی مانیفست android:nativeHeapZeroInitialized
مقداردهی اولیه صفر را انتخاب کنند. از طرف دیگر، مقدار دهی اولیه Heap Zero را می توان در زمان اجرا با موارد زیر کنترل کرد:
int mallopt(M_BIONIC_ZERO_INIT, 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
برای خرابی های بومی، وجود اشکالات را کنترل کنند. برای اطلاعات بیشتر در مورد اشکال زدایی کد بومی اندروید، اطلاعات اینجا را ببینید.