หน่วยความจำเริ่มต้นเป็นศูนย์

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

รายงานข้อผิดพลาด

เครื่องมือของเราสร้างรายงานข้อบกพร่องเชิงลึกที่มีข้อมูลเพิ่มเติมเพื่อช่วยในการแก้ไขข้อบกพร่อง การจัดสรรเพิ่มเติมและการติดตามสแต็กการจัดสรรคืนช่วยให้เข้าใจวงจรชีวิตของการจัดสรรที่กำหนดได้ดีขึ้น และนำไปสู่จุดบกพร่องด้านความปลอดภัยของหน่วยความจำที่เป็นสาเหตุรูทได้เร็วยิ่งขึ้นมาก

ตัวอย่างรายงานข้อผิดพลาดที่สร้างโดยเครื่องมือความปลอดภัยของหน่วยความจำ
รูปที่ 1 : รายงานข้อผิดพลาดที่สร้างโดยเครื่องมือความปลอดภัยของหน่วยความจำ

ในระหว่างการพัฒนา ผู้จำหน่ายควรตรวจสอบการมีอยู่ของจุดบกพร่องโดยการตรวจสอบ /data/tombstones และ logcat เพื่อหาข้อขัดข้องแบบเนทิฟ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดีบักโค้ดเนทิฟของ Android โปรดดูข้อมูล ที่นี่