หน่วยความจำที่ไม่มีการกำหนดค่าใน C และ C++ คือสาเหตุที่พบบ่อยของปัญหาด้านความเสถียร ข้อบกพร่องด้านความปลอดภัยของหน่วยความจำ และการรั่วไหลของข้อมูล เพื่อหลีกเลี่ยงปัญหาเหล่านี้ Android เริ่มต้นหน่วยความจำให้ได้มากที่สุด
หน่วยความจำพื้นที่ผู้ใช้เริ่มต้นเป็นศูนย์
สแต็กหน่วยความจำเริ่มต้นเป็น 0 ตั้งแต่ Android 12
ในโค้ดดั้งเดิมของแพลตฟอร์มทั้งหมด (รวมถึง JNI) และหน่วยความจำฮีปเป็น 0
เริ่มต้นในกระบวนการดั้งเดิมของแพลตฟอร์มทั้งหมด (เช่น netd
)
แต่ไม่อยู่ในzygote
หรือในแอป
แอปบุคคลที่หนึ่งและบุคคลที่สามที่สร้างด้วย NDK
แนะนำให้ใช้แฟล็กคอมไพเลอร์ -ftrivial-auto-var-init=zero
เพื่อกำหนดค่าเริ่มต้นของสแต็กในเครื่องเป็น 0
ตัวแปร คอมไพเลอร์จะลดจำนวน 0 ที่ไม่จำเป็นออก
เช่น เมื่อตัวแปรภายในเริ่มต้นอย่างชัดเจน
(เช่น ตัวแปร int x = 123;
x
เริ่มต้นเพียงครั้งเดียว)
ในกรณีที่โปรแกรมมีสแต็กบัฟเฟอร์ขนาดใหญ่ในประสิทธิภาพ
ฮอตสปอต นักพัฒนาซอฟต์แวร์สามารถปิดใช้งานการเริ่มต้นโดยใช้คอมไพเลอร์
แอตทริบิวต์:
__attribute__((__uninitialized__)) char buf[BUFSIZ];
นอกจากนี้ แอปยังเลือกใช้การเริ่มต้นใช้งานฮีป Zero ได้โดยใช้
แอตทริบิวต์ไฟล์ Manifest android:nativeHeapZeroInitialized
หรือจะควบคุมการเริ่มต้นฮีป 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
สำหรับการขัดข้องของระบบ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ
การแก้ไขข้อบกพร่องของโค้ดเนทีฟของ Android ดูข้อมูลที่นี่