UndefinedBehaviorSanitizer

UndefinedBehaviorSanitizer (UBSan) จะดำเนินการตรวจสอบที่เวลาคอมไพล์เพื่อ ตรวจสอบพฤติกรรมที่ไม่ได้กำหนดประเภทต่างๆ แม้ว่า UBSan จะตรวจหาข้อบกพร่องของลักษณะการทำงานที่ไม่แน่นอนได้หลายอย่าง แต่ Android รองรับสิ่งต่อไปนี้

  • การจัดแนว
  • bool
  • ขอบเขต
  • enum
  • float-cast-overflow
  • float-divide-by-zero
  • integer-divide-by-zero
  • แอตทริบิวต์ที่ไม่ใช่ Null
  • ค่าว่าง
  • คำสั่ง "return"
  • returns-nonnull-attribute
  • shift-base
  • shift-exponent
  • signed-integer-overflow
  • ไม่สามารถเข้าถึง
  • unsigned-integer-overflow
  • vla-bound

แม้ว่าการล้นของจำนวนเต็มที่ไม่มีเครื่องหมายจะไม่ใช่ลักษณะการทำงานที่ไม่ได้กำหนดไว้ในทางเทคนิค แต่จะรวมอยู่ใน Sanitizer และใช้ในโมดูล Android หลายโมดูล รวมถึงคอมโพเนนต์ mediaserver เพื่อขจัดช่องโหว่ที่อาจเกิดขึ้นจากการล้นของจำนวนเต็ม

การใช้งาน

ในระบบบิลด์ของ Android คุณสามารถเปิดใช้ UBSan ได้ทั้งแบบส่วนกลางหรือแบบเฉพาะที่ หากต้องการเปิดใช้ UBSan ทั่วโลก ให้ตั้งค่า SANITIZE_TARGET ใน Android.mk หากต้องการเปิดใช้ UBSan ที่ระดับต่อโมดูล ให้ตั้งค่า LOCAL_SANITIZE และระบุลักษณะการทำงานที่ไม่ได้กำหนดซึ่งคุณต้องการค้นหาใน Android.mk เช่น

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0

LOCAL_SRC_FILES:= sanitizer-status.c

LOCAL_MODULE:= sanitizer-status

LOCAL_SANITIZE := alignment bounds null unreachable integer
LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer

include $(BUILD_EXECUTABLE)

และการกำหนดค่าพิมพ์เขียว (Android.bp) ที่เทียบเท่า

cc_binary {

    cflags: [
        "-std=c11",
        "-Wall",
        "-Werror",
        "-O0",
    ],

    srcs: ["sanitizer-status.c"],

    name: "sanitizer-status",

    sanitize: {
        misc_undefined: [
            "alignment",
            "bounds",
            "null",
            "unreachable",
            "integer",
        ],
        diag: {
            misc_undefined: [
                "alignment",
                "bounds",
                "null",
                "unreachable",
                "integer",
            ],
        },
    },

}

แป้นพิมพ์ลัด UBSan

นอกจากนี้ Android ยังมีทางลัด 2 รายการ ได้แก่ integer และ default-ub เพื่อเปิดใช้ชุดโปรแกรมทำความสะอาดพร้อมกัน โดย integer จะเปิดใช้ integer-divide-by-zero, signed-integer-overflow และ unsigned-integer-overflow default-ub จะเปิดใช้การตรวจสอบที่มีปัญหาด้านประสิทธิภาพของคอมไพเลอร์น้อยที่สุด bool, integer-divide-by-zero, return, returns-nonnull-attribute, shift-exponent, unreachable and vla-bound คลาส Integer Sanitizer สามารถใช้กับ SANITIZE_TARGET และ LOCAL_SANITIZE ได้ ในขณะที่ default-ub ใช้ได้กับ SANITIZE_TARGET เท่านั้น

การรายงานข้อผิดพลาดที่ดีขึ้น

การติดตั้งใช้งาน UBSan เริ่มต้นของ Android จะเรียกใช้ฟังก์ชันที่ระบุเมื่อพบลักษณะการทำงานที่ไม่ได้กำหนด โดยค่าเริ่มต้น ฟังก์ชันนี้จะหยุด อย่างไรก็ตาม ตั้งแต่เดือนตุลาคม 2016 เป็นต้นมา UBSan ใน Android มีไลบรารีรันไทม์ที่ไม่บังคับ ซึ่ง ให้การรายงานข้อผิดพลาดที่ละเอียดยิ่งขึ้น รวมถึงประเภทของลักษณะการทำงานที่ไม่ได้กำหนด ที่พบ ข้อมูลไฟล์และบรรทัดซอร์สโค้ด หากต้องการเปิดใช้การรายงานข้อผิดพลาดนี้ พร้อมการตรวจสอบจำนวนเต็ม ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ Android.mk

LOCAL_SANITIZE:=integer
LOCAL_SANITIZE_DIAG:=integer

ค่า LOCAL_SANITIZE จะเปิดใช้ Sanitizer ในระหว่างการสร้าง LOCAL_SANITIZE_DIAG จะเปิดโหมดการวินิจฉัยสำหรับ Sanitizer ที่ระบุ คุณ ตั้งค่า LOCAL_SANITIZE และ LOCAL_SANITIZE_DIAG เป็นค่าที่แตกต่างกันได้ แต่ จะเปิดใช้เฉพาะการตรวจสอบใน LOCAL_SANITIZE เท่านั้น หากไม่ได้ระบุการตรวจสอบใน LOCAL_SANITIZE แต่ระบุไว้ใน LOCAL_SANITIZE_DIAG ระบบจะไม่เปิดใช้การตรวจสอบ และจะไม่แสดงข้อความการวินิจฉัย

ตัวอย่างข้อมูลที่ไลบรารีรันไทม์ UBSan แสดงมีดังนี้

pixel-xl:/ # sanitizer-status ubsan
sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')

การล้างข้อมูลการล้นจำนวนเต็ม

การล้นของจำนวนเต็มโดยไม่ตั้งใจอาจทำให้หน่วยความจำเสียหายหรือมีช่องโหว่ในการเปิดเผยข้อมูลในตัวแปรที่เชื่อมโยงกับการเข้าถึงหน่วยความจำหรือการจัดสรรหน่วยความจำ เราจึงเพิ่ม UndefinedBehaviorSanitizer (UBSan) ของ Clang และตัวตรวจสอบการล้นของจำนวนเต็มที่ลงชื่อและไม่ได้ลงชื่อเพื่อเสริมความแข็งแกร่ง ให้กับเฟรมเวิร์กสื่อใน Android 7.0 ใน Android 9 เราได้ขยาย UBSan ให้ครอบคลุมคอมโพเนนต์ต่างๆ มากขึ้น และปรับปรุงการรองรับระบบบิลด์สำหรับ UBSan

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

ตัวอย่างและแหล่งที่มา

การล้างข้อมูลการล้นจำนวนเต็ม (IntSan) มาจากคอมไพเลอร์และเพิ่มการวัดผลลงในไบนารีระหว่างเวลาคอมไพล์เพื่อตรวจหาการล้นของเลขคณิต โดยจะเปิดใช้โดยค่าเริ่มต้นในคอมโพเนนต์ต่างๆ ทั่วทั้งแพลตฟอร์ม เช่น /platform/external/libnl/Android.bp

การใช้งาน

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

เราขอแนะนำอย่างยิ่งให้คุณเปิดใช้การล้างข้อมูลการล้นจำนวนเต็มสำหรับคอมโพเนนต์เพิ่มเติม ผู้สมัครที่เหมาะสมคือโค้ดเนทีฟที่มีสิทธิ์หรือโค้ดเนทีฟที่ แยกวิเคราะห์อินพุตของผู้ใช้ที่ไม่น่าเชื่อถือ มีโอเวอร์เฮดประสิทธิภาพเล็กน้อยที่เชื่อมโยง กับ Sanitizer ซึ่งขึ้นอยู่กับการใช้งานโค้ดและความแพร่หลายของ การดำเนินการทางคณิตศาสตร์ คาดว่าจะมีค่าใช้จ่ายเพิ่มเติมเป็นเปอร์เซ็นต์เล็กน้อย และทดสอบหาก ประสิทธิภาพเป็นข้อกังวล

รองรับ IntSan ในไฟล์ Makefile

หากต้องการเปิดใช้ IntSan ใน Makefile ให้เพิ่ม

LOCAL_SANITIZE := integer_overflow
    # Optional features
    LOCAL_SANITIZE_DIAG := integer_overflow
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
  • LOCAL_SANITIZE จะใช้รายการตัวทำความสะอาดที่คั่นด้วยคอมมา โดย integer_overflow เป็นชุดตัวเลือกที่จัดแพ็กเกจไว้ล่วงหน้าสำหรับ ตัวทำความสะอาดการล้นจำนวนเต็มที่ลงนามและไม่ได้ลงนามแต่ละรายการที่มี ค่าเริ่มต้น BLOCKLIST
  • LOCAL_SANITIZE_DIAG เปิดโหมดการวินิจฉัยสำหรับ เครื่องมือฆ่าเชื้อ ใช้โหมดการวินิจฉัยระหว่างการทดสอบเท่านั้น เนื่องจากโหมดนี้จะไม่ หยุดเมื่อเกิดการล้น ซึ่งจะทำให้ข้อได้เปรียบด้านความปลอดภัยของการ ลดความเสี่ยงหมดไป ดูรายละเอียดเพิ่มเติมได้ที่การแก้ปัญหา
  • LOCAL_SANITIZE_BLOCKLIST ช่วยให้คุณระบุไฟล์ BLOCKLIST เพื่อป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับได้รับการล้างข้อมูล ดูรายละเอียดเพิ่มเติมได้ที่ส่วน การแก้ปัญหา

หากต้องการควบคุมอย่างละเอียดยิ่งขึ้น ให้เปิดใช้ Sanitizer ทีละรายการโดยใช้แฟล็กอย่างใดอย่างหนึ่ง หรือทั้ง 2 รายการ

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
    LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

รองรับ IntSan ในไฟล์พิมพ์เขียว

หากต้องการเปิดใช้การล้างข้อมูลการล้นจำนวนเต็มในไฟล์พิมพ์เขียว เช่น /platform/external/libnl/Android.bp ให้เพิ่มข้อมูลต่อไปนี้

   sanitize: {
          integer_overflow: true,
          diag: {
              integer_overflow: true,
          },
          BLOCKLIST: "modulename_BLOCKLIST.txt",
       },

เช่นเดียวกับไฟล์ Make พร็อพเพอร์ตี้ integer_overflow เป็นชุดตัวเลือกที่แพ็กไว้ล่วงหน้า สำหรับตัวตรวจสอบการล้นของจำนวนเต็มที่ลงชื่อและไม่ได้ลงชื่อแต่ละรายการ โดยมีค่าเริ่มต้น BLOCKLIST

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

พร็อพเพอร์ตี้ BLOCKLIST ช่วยให้ระบุไฟล์ BLOCKLIST ได้ ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับ ได้รับการล้างข้อมูล ดูรายละเอียดเพิ่มเติมได้ที่การแก้ปัญหา

หากต้องการเปิดใช้ Sanitizer แต่ละรายการ ให้ใช้คำสั่งต่อไปนี้

   sanitize: {
          misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
          diag: {
              misc_undefined: ["signed-integer-overflow",
                               "unsigned-integer-overflow",],
          },
          BLOCKLIST: "modulename_BLOCKLIST.txt",
       },

การแก้ปัญหา

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

หากต้องการค้นหาการหยุดทำงานที่เกิดจากการล้างข้อมูลในการสร้างของผู้ใช้ ให้ค้นหา SIGABRT ข้อขัดข้องที่มีข้อความ Abort ซึ่งระบุว่าตรวจพบการล้น โดย UBSan เช่น

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
    signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    Abort message: 'ubsan: sub-overflow'

Stack Trace ควรมีฟังก์ชันที่ทำให้เกิดการหยุดทำงาน อย่างไรก็ตาม การล้นที่เกิดขึ้นในฟังก์ชันแบบอินไลน์อาจไม่ปรากฏใน Stack Trace

หากต้องการหาสาเหตุหลักได้ง่ายขึ้น ให้เปิดใช้การวินิจฉัยในไลบรารี ที่ทริกเกอร์การหยุดชั่วคราวและพยายามจำลองข้อผิดพลาด เมื่อเปิดใช้การวินิจฉัย กระบวนการจะไม่หยุดทำงาน แต่จะทำงานต่อไปแทน การไม่ยกเลิกจะช่วยเพิ่มจำนวนการล้นที่ไม่มีอันตรายในเส้นทางการดำเนินการหนึ่งๆ โดยไม่ต้องคอมไพล์ใหม่หลังจากแก้ไขข้อบกพร่องแต่ละรายการ การวินิจฉัยจะสร้างข้อความแสดงข้อผิดพลาดซึ่งมีหมายเลขบรรทัดและไฟล์ต้นฉบับ ที่ทำให้เกิดการหยุดทำงาน

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

เมื่อพบการดำเนินการทางคณิตศาสตร์ที่มีปัญหาแล้ว ให้ตรวจสอบว่าการล้น นั้นไม่เป็นอันตรายและเป็นไปตามที่ต้องการ (เช่น ไม่มีผลกระทบด้านความปลอดภัย) คุณแก้ไขการหยุดทำงานของ Sanitizer ได้โดยทำดังนี้

  • การปรับโครงสร้างโค้ดเพื่อหลีกเลี่ยงการล้น (ตัวอย่าง)
  • การล้นอย่างชัดเจนผ่านฟังก์ชัน __builtin_*_overflow ของ Clang (ตัวอย่าง)
  • ปิดใช้การล้างข้อมูลในฟังก์ชันโดยระบุแอตทริบิวต์ no_sanitize (ตัวอย่าง)
  • การปิดใช้การล้างข้อมูลของฟังก์ชันหรือไฟล์ต้นฉบับผ่านไฟล์ BLOCKLIST (ตัวอย่าง)

คุณควรใช้โซลูชันที่ละเอียดที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่น ฟังก์ชันขนาดใหญ่ที่มีการดำเนินการทางคณิตศาสตร์หลายอย่างและการดำเนินการที่ทำให้เกิดการล้นเพียงอย่างเดียว ควรมีการปรับโครงสร้างการดำเนินการเดียวมากกว่าการบล็อกทั้งฟังก์ชัน

รูปแบบที่พบบ่อยซึ่งอาจทำให้เกิดการล้นที่ไม่มีอันตราย ได้แก่

ขอแนะนำให้นักพัฒนาแอปตรวจสอบว่าในกรณีที่ Sanitizer ตรวจพบ การล้นนั้นไม่มีผลข้างเคียงหรือผลกระทบด้านความปลอดภัยโดยไม่ตั้งใจ ก่อนที่จะปิดใช้การทำความสะอาด

ปิดใช้ IntSan

คุณปิดใช้ IntSan ได้ด้วย BLOCKLIST หรือแอตทริบิวต์ฟังก์ชัน ปิดใช้เท่าที่จำเป็น และเฉพาะในกรณีที่การปรับโครงสร้างโค้ดไม่สมเหตุสมผลหรือมี ค่าใช้จ่ายด้านประสิทธิภาพที่ทำให้เกิดปัญหา

ดูข้อมูลเพิ่มเติมเกี่ยวกับการปิดใช้ IntSan ด้วยแอตทริบิวต์ ฟังก์ชันและการจัดรูปแบบ ไฟล์ BLOCKLIST ได้ในเอกสารประกอบ Clang ต้นทาง ควรจำกัดขอบเขตการบล็อกเฉพาะตัวทำความสะอาดนั้นๆ โดย ใช้ชื่อส่วนที่ระบุตัวทำความสะอาดเป้าหมายเพื่อหลีกเลี่ยงไม่ให้ส่งผลกระทบต่อตัวทำความสะอาดอื่นๆ

การตรวจสอบความถูกต้อง

ปัจจุบันยังไม่มีการทดสอบ CTS สำหรับการล้างข้อมูล Integer Overflow โดยเฉพาะ แต่ให้ตรวจสอบว่าการทดสอบ CTS ผ่านหรือไม่ผ่านโดยเปิดใช้ IntSan เพื่อยืนยัน ว่าไม่ได้ส่งผลกระทบต่ออุปกรณ์

การล้างข้อมูลขอบเขต

BoundsSanitizer (BoundSan) จะเพิ่มการวัดคุมลงในไบนารีเพื่อแทรกการตรวจสอบขอบเขต รอบการเข้าถึงอาร์เรย์ การตรวจสอบเหล่านี้จะเพิ่มขึ้นหากคอมไพเลอร์ไม่สามารถ พิสูจน์ในเวลาคอมไพล์ว่าการเข้าถึงจะปลอดภัย และหากขนาดของอาร์เรย์ จะทราบในเวลาเรียกใช้ เพื่อให้ตรวจสอบได้ Android 10 ใช้ BoundSan ใน บลูทูธและตัวแปลงรหัส BoundSan จัดทำโดยคอมไพเลอร์และเปิดใช้โดย ค่าเริ่มต้นในคอมโพเนนต์ต่างๆ ทั่วทั้งแพลตฟอร์ม

การใช้งาน

BoundSan ใช้ตัวตรวจสอบขอบเขตของ UBSan การลดความเสี่ยงนี้จะเปิดใช้ในระดับโมดูล ซึ่งช่วย รักษาความปลอดภัยของคอมโพเนนต์ที่สำคัญของ Android และไม่ควรปิดใช้

เราขอแนะนำอย่างยิ่งให้คุณเปิดใช้ BoundSan สำหรับคอมโพเนนต์เพิ่มเติม ผู้สมัครที่เหมาะสมคือโค้ดเนทีฟที่มีสิทธิ์หรือโค้ดเนทีฟที่ซับซ้อนซึ่งแยกวิเคราะห์ อินพุตของผู้ใช้ที่ไม่น่าเชื่อถือ ค่าใช้จ่ายด้านประสิทธิภาพที่เชื่อมโยงกับการเปิดใช้ BoundSan ขึ้นอยู่กับจำนวนการเข้าถึงอาร์เรย์ที่พิสูจน์ไม่ได้ว่าปลอดภัย คาดว่าจะมีค่าใช้จ่ายเพิ่มเติมโดยเฉลี่ยเป็นเปอร์เซ็นต์เล็กน้อย และทดสอบหากกังวลเรื่องประสิทธิภาพ

เปิดใช้ BoundSan ในไฟล์พิมพ์เขียว

คุณเปิดใช้ BoundSan ในไฟล์ Blueprint ได้โดยเพิ่ม "bounds" ไปยังพร็อพเพอร์ตี้ misc_undefined sanitize สำหรับโมดูลไบนารีและไลบรารี

    sanitize: {
       misc_undefined: ["bounds"],
       diag: {
          misc_undefined: ["bounds"],
       },
       BLOCKLIST: "modulename_BLOCKLIST.txt",
diag

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

รายการที่บล็อก

พร็อพเพอร์ตี้ BLOCKLIST ช่วยให้ระบุไฟล์ BLOCKLIST ซึ่งนักพัฒนาแอปใช้เพื่อป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับ ได้รับการล้างข้อมูลได้ ใช้พร็อพเพอร์ตี้นี้เฉพาะในกรณีที่ประสิทธิภาพเป็นปัญหาและไฟล์/ฟังก์ชันเป้าหมายมีส่วนสำคัญ ตรวจสอบไฟล์/ฟังก์ชันเหล่านี้ด้วยตนเอง เพื่อให้แน่ใจว่าการเข้าถึงอาร์เรย์ปลอดภัย ดูรายละเอียดเพิ่มเติมได้ที่การแก้ปัญหา

เปิดใช้ BoundSan ใน Makefile

คุณเปิดใช้ BoundSan ในไฟล์ Makefile ได้โดยเพิ่ม "bounds" ลงในตัวแปร LOCAL_SANITIZE สำหรับโมดูลไบนารีและไลบรารี

    LOCAL_SANITIZE := bounds
    # Optional features
    LOCAL_SANITIZE_DIAG := bounds
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt

LOCAL_SANITIZE ยอมรับรายการตัวทำความสะอาดที่คั่นด้วยคอมมา

LOCAL_SANITIZE_DIAG เปิดโหมดการวินิจฉัย ใช้โหมดการวินิจฉัย ระหว่างการทดสอบเท่านั้น โหมดการวินิจฉัยจะไม่ยกเลิกเมื่อเกิดการล้น ซึ่ง จะลบล้างข้อได้เปรียบด้านความปลอดภัยของการลดผลกระทบและมี ค่าใช้จ่ายด้านประสิทธิภาพที่สูงขึ้น จึงไม่แนะนำสำหรับบิลด์ที่ใช้งานจริง

LOCAL_SANITIZE_BLOCKLIST ช่วยให้ระบุไฟล์ BLOCKLIST ซึ่งอนุญาตให้นักพัฒนาซอฟต์แวร์ป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับ ได้รับการล้างข้อมูล ใช้พร็อพเพอร์ตี้นี้เฉพาะในกรณีที่ประสิทธิภาพเป็นปัญหาและไฟล์/ฟังก์ชันเป้าหมายมีส่วนสำคัญ ตรวจสอบไฟล์/ฟังก์ชันเหล่านี้ด้วยตนเอง เพื่อให้แน่ใจว่าการเข้าถึงอาร์เรย์ปลอดภัย ดูรายละเอียดเพิ่มเติมได้ที่การแก้ปัญหา

ปิดใช้ BoundSan

คุณปิดใช้ BoundSan ในฟังก์ชันและไฟล์ต้นฉบับได้ด้วย BLOCKLIST หรือ แอตทริบิวต์ฟังก์ชัน เราขอแนะนำให้เปิดใช้ BoundSan ไว้ ดังนั้นให้ปิดใช้เฉพาะในกรณีต่อไปนี้ ฟังก์ชันหรือไฟล์สร้างค่าใช้จ่ายด้านประสิทธิภาพจำนวนมาก และ ได้ตรวจสอบแหล่งที่มาด้วยตนเองแล้ว

ดูข้อมูลเพิ่มเติมเกี่ยวกับการปิดใช้ BoundSan ด้วยแอตทริบิวต์ ฟังก์ชันและการจัดรูปแบบ ไฟล์ BLOCKLIST ได้ที่เอกสารประกอบของ Clang LLVM กำหนดขอบเขต BLOCKLISTing ให้กับ Sanitizer ที่เฉพาะเจาะจงโดยใช้ชื่อส่วนที่ระบุ Sanitizer เป้าหมายเพื่อหลีกเลี่ยงไม่ให้ส่งผลกระทบต่อ Sanitizer อื่นๆ

การตรวจสอบความถูกต้อง

ไม่มีการทดสอบ CTS สำหรับ BoundSan โดยเฉพาะ แต่ให้ตรวจสอบว่าการทดสอบ CTS ผ่านโดยเปิดหรือปิดใช้ BoundSan เพื่อยืนยันว่าไม่ได้ส่งผลกระทบต่อ อุปกรณ์

การแก้ปัญหา

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

คุณระบุข้อผิดพลาด BoundSan ได้ง่ายๆ เนื่องจากมีข้อความหยุดทำงานต่อไปนี้ tombstone:

    pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
    signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    Abort message: 'ubsan: out-of-bounds'

เมื่อเรียกใช้ในโหมดการวินิจฉัย ระบบจะพิมพ์ไฟล์ต้นฉบับ หมายเลขบรรทัด และค่าดัชนี ไปยัง logcat โดยค่าเริ่มต้น โหมดนี้จะไม่ แสดงข้อความยกเลิก ตรวจสอบlogcatเพื่อดูข้อผิดพลาด

    external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'