หน่วยความจำที่ไม่ได้เตรียมใช้งานใน 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
หน่วยความจำเคอร์เนลเริ่มต้นเป็นศูนย์
เคอร์เนลสแต็กและฮีปเริ่มต้นเป็นศูนย์สำหรับเคอร์เนล 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 โปรดดูข้อมูล ที่นี่