अपरिभाषित व्यवहार सैनिटाइज़र

अनडिफ़ाइंडबिहेवियरसैनिटाइज़र (UBSan) विभिन्न प्रकार के अपरिभाषित व्यवहार की जाँच के लिए संकलन-समय उपकरण निष्पादित करता है। जबकि UBSan कई अपरिभाषित व्यवहार बगों का पता लगाने में सक्षम है, Android समर्थन करता है:

  • संरेखण
  • बूल
  • सीमा
  • enum
  • फ्लोट-कास्ट-ओवरफ्लो
  • फ्लोट-विभाजित-शून्य
  • पूर्णांक-विभाजित-शून्य
  • गैर-शून्य-विशेषता
  • व्यर्थ
  • वापस करना
  • रिटर्न-गैर-शून्य-विशेषता
  • शिफ्ट-बेस
  • पाली-प्रतिपादक
  • हस्ताक्षरित-पूर्णांक-अतिप्रवाह
  • नहीं पहुंचा जा सकता
  • अहस्ताक्षरित-पूर्णांक-अतिप्रवाह
  • वीएलए-बाध्य

अहस्ताक्षरित-पूर्णांक-अतिप्रवाह, जबकि तकनीकी रूप से अपरिभाषित व्यवहार नहीं है, सैनिटाइज़र में शामिल है और किसी भी अव्यक्त पूर्णांक-अतिप्रवाह कमजोरियों को खत्म करने के लिए मीडियासर्वर घटकों सहित कई एंड्रॉइड मॉड्यूल में उपयोग किया जाता है।

कार्यान्वयन

एंड्रॉइड बिल्ड सिस्टम में, आप UBSan को वैश्विक या स्थानीय स्तर पर सक्षम कर सकते हैं। UBSan को विश्व स्तर पर सक्षम करने के लिए, Android.mk में SANITIZE_TARGET सेट करें। 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",
            ],
        },
    },

}

यूबीएसएन शॉर्टकट

एंड्रॉइड में एक ही समय में सैनिटाइज़र के एक सेट को सक्षम करने के लिए दो शॉर्टकट, integer और default-ub भी हैं। पूर्णांक 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 पूर्णांक सैनिटाइज़र वर्ग का उपयोग SANITIZE_TARGET और LOCAL_SANITIZE के साथ किया जा सकता है, जबकि डिफ़ॉल्ट-ub का उपयोग केवल SANITIZE_TARGET के साथ किया जा सकता है।

बेहतर त्रुटि रिपोर्टिंग

अपरिभाषित व्यवहार सामने आने पर Android का डिफ़ॉल्ट UBSan कार्यान्वयन एक निर्दिष्ट फ़ंक्शन को कॉल करता है। डिफ़ॉल्ट रूप से, यह फ़ंक्शन निरस्त है. हालाँकि, अक्टूबर 2016 से शुरू होकर, Android पर UBSan में एक वैकल्पिक रनटाइम लाइब्रेरी है जो अधिक विस्तृत त्रुटि रिपोर्टिंग देती है, जिसमें सामने आए अपरिभाषित व्यवहार के प्रकार, फ़ाइल और स्रोत कोड लाइन जानकारी शामिल है। पूर्णांक जाँच के साथ इस त्रुटि रिपोर्टिंग को सक्षम करने के लिए Android.mk फ़ाइल में निम्नलिखित जोड़ें:

LOCAL_SANITIZE:=integer
LOCAL_SANITIZE_DIAG:=integer

LOCAL_SANITIZE मान निर्माण के दौरान सैनिटाइज़र को सक्षम बनाता है। LOCAL_SANITIZE_DIAG निर्दिष्ट सैनिटाइज़र के लिए डायग्नोस्टिक मोड चालू करता है। 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')

पूर्णांक अतिप्रवाह स्वच्छता

अनपेक्षित पूर्णांक अतिप्रवाह मेमोरी एक्सेस या मेमोरी आवंटन से जुड़े चर में मेमोरी भ्रष्टाचार या सूचना प्रकटीकरण कमजोरियों का कारण बन सकता है। इससे निपटने के लिए, हमने एंड्रॉइड 7.0 में मीडिया फ्रेमवर्क को सख्त करने के लिए क्लैंग के अनडिफाइंडबिहेवियरसैनिटाइजर (यूबीएसएन) हस्ताक्षरित और अहस्ताक्षरित पूर्णांक ओवरफ्लो सैनिटाइजर को जोड़ा। Android 9 में, हमने अधिक घटकों को कवर करने के लिए UBSan का विस्तार किया और इसके लिए बिल्ड सिस्टम समर्थन में सुधार किया।

इसे अंकगणितीय संचालन/निर्देशों के इर्द-गिर्द जांच जोड़ने के लिए डिज़ाइन किया गया है - जो अतिप्रवाह हो सकता है - यदि कोई अतिप्रवाह होता है तो प्रक्रिया को सुरक्षित रूप से निरस्त करने के लिए। ये सैनिटाइज़र मेमोरी भ्रष्टाचार और सूचना प्रकटीकरण कमजोरियों की एक पूरी श्रेणी को कम कर सकते हैं जहां मूल कारण एक पूर्णांक अतिप्रवाह है, जैसे कि मूल स्टेजफ्राइट भेद्यता।

उदाहरण और स्रोत

इंटीजर ओवरफ्लो सैनिटाइजेशन (इंटसैन) कंपाइलर द्वारा प्रदान किया जाता है और अंकगणितीय ओवरफ्लो का पता लगाने के लिए संकलन समय के दौरान बाइनरी में इंस्ट्रूमेंटेशन जोड़ता है। यह पूरे प्लेटफ़ॉर्म पर विभिन्न घटकों में डिफ़ॉल्ट रूप से सक्षम है, उदाहरण के लिए /platform/external/libnl/Android.bp

कार्यान्वयन

IntSan UBSan के हस्ताक्षरित और अहस्ताक्षरित पूर्णांक अतिप्रवाह सैनिटाइज़र का उपयोग करता है। यह शमन प्रति-मॉड्यूल स्तर पर सक्षम है। यह एंड्रॉइड के महत्वपूर्ण घटकों को सुरक्षित रखने में मदद करता है और इसे अक्षम नहीं किया जाना चाहिए।

हम आपको अतिरिक्त घटकों के लिए इंटीजर ओवरफ्लो सैनिटाइजेशन सक्षम करने के लिए दृढ़ता से प्रोत्साहित करते हैं। आदर्श उम्मीदवार विशेषाधिकार प्राप्त मूल कोड या मूल कोड होते हैं जो अविश्वसनीय उपयोगकर्ता इनपुट को पार्स करते हैं। सैनिटाइज़र के साथ एक छोटा प्रदर्शन ओवरहेड जुड़ा हुआ है जो कोड के उपयोग और अंकगणितीय संचालन की व्यापकता पर निर्भर है। एक छोटे ओवरहेड प्रतिशत की अपेक्षा करें और यदि प्रदर्शन चिंता का विषय है तो परीक्षण करें।

मेकफ़ाइल्स में IntSan का समर्थन करना

मेकफ़ाइल में IntSan को सक्षम करने के लिए, जोड़ें:

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 फ़ाइल निर्दिष्ट करने की अनुमति देता है। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

यदि आप अधिक विस्तृत नियंत्रण चाहते हैं, तो एक या दोनों झंडों का उपयोग करके सैनिटाइज़र को व्यक्तिगत रूप से सक्षम करें:

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",
       },

मेक फ़ाइलों की तरह, integer_overflow प्रॉपर्टी एक डिफ़ॉल्ट BLOCKLIST के साथ व्यक्तिगत हस्ताक्षरित और अहस्ताक्षरित पूर्णांक ओवरफ़्लो सैनिटाइज़र के लिए विकल्पों का एक पूर्व-पैक सेट है।

गुणों का diag सेट सैनिटाइज़र के लिए डायग्नोस्टिक्स मोड को सक्षम बनाता है। परीक्षण के दौरान केवल डायग्नोस्टिक्स मोड का उपयोग करें। डायग्नोस्टिक्स मोड ओवरफ्लो पर निरस्त नहीं होता है, जो उपयोगकर्ता बिल्ड में शमन के सुरक्षा लाभ को पूरी तरह से नकार देता है। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

BLOCKLIST संपत्ति एक BLOCKLIST फ़ाइल के विनिर्देशन की अनुमति देती है जो डेवलपर्स को फ़ंक्शंस और स्रोत फ़ाइलों को स्वच्छ होने से रोकने की अनुमति देती है। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

सैनिटाइज़र को व्यक्तिगत रूप से सक्षम करने के लिए, उपयोग करें:

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

समस्या निवारण

यदि आप नए घटकों में पूर्णांक अतिप्रवाह स्वच्छता को सक्षम कर रहे हैं, या उन प्लेटफ़ॉर्म लाइब्रेरीज़ पर भरोसा करते हैं जिनमें पूर्णांक अतिप्रवाह स्वच्छता है, तो आपको सौम्य पूर्णांक अतिप्रवाह के साथ कुछ समस्याओं का सामना करना पड़ सकता है, जिससे रुकावटें हो सकती हैं। आपको यह सुनिश्चित करने के लिए सक्षम स्वच्छता वाले घटकों का परीक्षण करना चाहिए कि सौम्य अतिप्रवाह सतह पर आ सकता है।

उपयोगकर्ता बिल्ड में स्वच्छता के कारण होने वाली रुकावटों को खोजने के लिए, UBSan द्वारा पकड़े गए अतिप्रवाह का संकेत देने वाले निरस्त संदेशों के साथ SIGABRT क्रैश की खोज करें, जैसे:

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

स्टैक ट्रेस में वह फ़ंक्शन शामिल होना चाहिए जो निरस्त करता है, हालाँकि, इनलाइन फ़ंक्शंस में होने वाले ओवरफ़्लो स्टैक ट्रेस में स्पष्ट नहीं हो सकते हैं।

मूल कारण को अधिक आसानी से निर्धारित करने के लिए, लाइब्रेरी में डायग्नोस्टिक्स को सक्षम करें जो गर्भपात को ट्रिगर करता है और त्रुटि को पुन: उत्पन्न करने का प्रयास करता है। डायग्नोस्टिक्स सक्षम होने पर, प्रक्रिया समाप्त नहीं होगी और इसके बजाय चलती रहेगी। निरस्त न करने से प्रत्येक बग को ठीक करने के बाद पुन: संकलित किए बिना किसी विशेष निष्पादन पथ में सौम्य ओवरफ्लो की संख्या को अधिकतम करने में मदद मिलती है। डायग्नोस्टिक्स एक त्रुटि संदेश उत्पन्न करता है जिसमें लाइन नंबर और स्रोत फ़ाइल शामिल होती है जो निरस्त करती है:

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')

एक बार जब समस्याग्रस्त अंकगणितीय ऑपरेशन स्थित हो जाए, तो सुनिश्चित करें कि अतिप्रवाह सौम्य और इच्छित है (उदाहरण के लिए इसका कोई सुरक्षा निहितार्थ नहीं है)। आप सैनिटाइज़र की समाप्ति का समाधान इस प्रकार कर सकते हैं:

  • अतिप्रवाह से बचने के लिए कोड को पुनः सक्रिय करना ( उदाहरण )
  • क्लैंग के __बिल्टिन_*_ओवरफ़्लो फ़ंक्शंस के माध्यम से स्पष्ट रूप से ओवरफ़्लो ( उदाहरण )
  • no_sanitize विशेषता निर्दिष्ट करके फ़ंक्शन में स्वच्छता अक्षम करना ( उदाहरण )
  • ब्लॉकलिस्ट फ़ाइल के माध्यम से किसी फ़ंक्शन या स्रोत फ़ाइल का स्वच्छताकरण अक्षम करना ( उदाहरण )

आपको यथासंभव यथासंभव दानेदार घोल का उपयोग करना चाहिए। उदाहरण के लिए, कई अंकगणितीय ऑपरेशनों और एक अतिप्रवाहित ऑपरेशन वाले एक बड़े फ़ंक्शन में संपूर्ण फ़ंक्शन को ब्लॉकलिस्ट किए जाने के बजाय एकल ऑपरेशन को पुनः सक्रिय किया जाना चाहिए।

सामान्य पैटर्न जिनके परिणामस्वरूप सौम्य अतिप्रवाह हो सकता है उनमें शामिल हैं:

  • अंतर्निहित कास्ट जहां हस्ताक्षरित प्रकार में डाले जाने से पहले एक अहस्ताक्षरित अतिप्रवाह होता है ( उदाहरण )
  • लिंक्ड सूची विलोपन जो विलोपन पर लूप इंडेक्स को कम करता है ( उदाहरण )
  • वास्तविक अधिकतम मान निर्दिष्ट करने के बजाय एक अहस्ताक्षरित प्रकार को -1 पर निर्दिष्ट करना ( उदाहरण )
  • लूप्स जो स्थिति में एक अहस्ताक्षरित पूर्णांक को घटाते हैं ( उदाहरण , उदाहरण )

यह अनुशंसा की जाती है कि डेवलपर्स यह आश्वस्त करें कि जिन मामलों में सैनिटाइज़र एक अतिप्रवाह का पता लगाता है, वह वास्तव में सैनिटाइजेशन को अक्षम करने से पहले बिना किसी अनपेक्षित दुष्प्रभाव या सुरक्षा निहितार्थ के सौम्य है।

IntSan को अक्षम करना

आप ब्लॉकलिस्ट या फ़ंक्शन विशेषताओं के साथ IntSan को अक्षम कर सकते हैं। संयम से और केवल तभी अक्षम करें जब कोड को दोबारा बनाना अन्यथा अनुचित हो या यदि समस्याग्रस्त प्रदर्शन ओवरहेड हो।

फ़ंक्शन विशेषताओं और BLOCKLIST फ़ाइल फ़ॉर्मेटिंग के साथ IntSan को अक्षम करने के बारे में अधिक जानकारी के लिए अपस्ट्रीम क्लैंग दस्तावेज़ देखें। अन्य सैनिटाइज़र को प्रभावित करने से बचने के लिए लक्ष्य सैनिटाइज़र को निर्दिष्ट करने वाले अनुभाग नामों का उपयोग करके ब्लॉकलिस्टिंग को विशेष सैनिटाइज़र तक सीमित किया जाना चाहिए।

मान्यकरण

वर्तमान में, इंटीजर ओवरफ़्लो सेनिटाइज़ेशन के लिए विशेष रूप से कोई सीटीएस परीक्षण नहीं हैं। इसके बजाय, यह सुनिश्चित करें कि CTS परीक्षण IntSan सक्षम होने के साथ या उसके बिना भी पास हो जाएं ताकि यह सत्यापित किया जा सके कि यह डिवाइस को प्रभावित नहीं कर रहा है।

सीमा स्वच्छता

बाउंडसैनिटाइज़र (बाउंडसैन) एरे एक्सेस के आसपास बाउंड चेक डालने के लिए बायनेरिज़ में इंस्ट्रूमेंटेशन जोड़ता है। यदि कंपाइलर कंपाइल समय पर यह साबित नहीं कर पाता है कि पहुंच सुरक्षित होगी और यदि ऐरे का आकार रनटाइम पर ज्ञात हो जाएगा, तो ये चेक जोड़े जाते हैं, ताकि इसके विरुद्ध जांच की जा सके। एंड्रॉइड 10 ब्लूटूथ और कोडेक्स में बाउंडसैन को तैनात करता है। बाउंडसैन कंपाइलर द्वारा प्रदान किया गया है और पूरे प्लेटफ़ॉर्म पर विभिन्न घटकों में डिफ़ॉल्ट रूप से सक्षम है।

कार्यान्वयन

बाउंडसैन यूबीसैन के बाउंड्स सैनिटाइज़र का उपयोग करता है। यह शमन प्रति-मॉड्यूल स्तर पर सक्षम है। यह एंड्रॉइड के महत्वपूर्ण घटकों को सुरक्षित रखने में मदद करता है और इसे अक्षम नहीं किया जाना चाहिए।

हम आपको अतिरिक्त घटकों के लिए बाउंडसन को सक्षम करने के लिए दृढ़ता से प्रोत्साहित करते हैं। आदर्श उम्मीदवार विशेषाधिकार प्राप्त मूल कोड या जटिल मूल कोड होते हैं जो अविश्वसनीय उपयोगकर्ता इनपुट को पार्स करते हैं। बाउंडसन को सक्षम करने से जुड़ा प्रदर्शन ओवरहेड ऐरे एक्सेस की संख्या पर निर्भर है जिसे सुरक्षित साबित नहीं किया जा सकता है। औसतन एक छोटे ओवरहेड प्रतिशत की अपेक्षा करें और परीक्षण करें कि क्या प्रदर्शन चिंता का विषय है।

ब्लूप्रिंट फ़ाइलों में बाउंडसैन को सक्षम करना

बाइनरी और लाइब्रेरी मॉड्यूल के लिए misc_undefined sanitize प्रॉपर्टी में "bounds" जोड़कर BoundSan को ब्लूप्रिंट फ़ाइलों में सक्षम किया जा सकता है:

    sanitize: {
       misc_undefined: ["bounds"],
       diag: {
          misc_undefined: ["bounds"],
       },
       BLOCKLIST: "modulename_BLOCKLIST.txt",
निदान

diag प्रॉपर्टी सैनिटाइज़र के लिए डायग्नोस्टिक्स मोड को सक्षम करती है। परीक्षण के दौरान केवल डायग्नोस्टिक्स मोड का उपयोग करें। डायग्नोस्टिक्स मोड ओवरफ्लो पर बंद नहीं होता है, जो शमन के सुरक्षा लाभ को नकारता है और उच्च प्रदर्शन ओवरहेड करता है, इसलिए इसे उत्पादन निर्माण के लिए अनुशंसित नहीं किया जाता है।

ब्लॉक सूची

BLOCKLIST प्रॉपर्टी एक BLOCKLIST फ़ाइल के विनिर्देशन की अनुमति देती है जिसका उपयोग डेवलपर्स फ़ंक्शंस और स्रोत फ़ाइलों को स्वच्छ होने से रोकने के लिए कर सकते हैं। इस संपत्ति का उपयोग केवल तभी करें जब प्रदर्शन चिंता का विषय हो और लक्षित फ़ाइलें/फ़ंक्शन महत्वपूर्ण योगदान दें। यह सुनिश्चित करने के लिए कि ऐरे एक्सेस सुरक्षित हैं, इन फ़ाइलों/फ़ंक्शंस का मैन्युअल रूप से ऑडिट करें। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

मेकफ़ाइल्स में बाउंडसैन को सक्षम करना

बाइनरी और लाइब्रेरी मॉड्यूल के लिए LOCAL_SANITIZE वेरिएबल में "bounds" जोड़कर बाउंडसैन को मेकफ़ाइल्स में सक्षम किया जा सकता है:

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

LOCAL_SANITIZE अल्पविराम से अलग की गई सैनिटाइज़र की सूची स्वीकार करता है।

LOCAL_SANITIZE_DIAG डायग्नोस्टिक्स मोड चालू करता है। परीक्षण के दौरान केवल डायग्नोस्टिक्स मोड का उपयोग करें। डायग्नोस्टिक्स मोड ओवरफ्लो पर बंद नहीं होता है, जो शमन के सुरक्षा लाभ को नकारता है और उच्च प्रदर्शन ओवरहेड करता है, इसलिए इसे उत्पादन निर्माण के लिए अनुशंसित नहीं किया जाता है।

LOCAL_SANITIZE_BLOCKLIST एक BLOCKLIST फ़ाइल के विनिर्देशन की अनुमति देता है जो डेवलपर्स को फ़ंक्शंस और स्रोत फ़ाइलों को सैनिटाइज़ होने से रोकने की अनुमति देता है। इस संपत्ति का उपयोग केवल तभी करें जब प्रदर्शन चिंता का विषय हो और लक्षित फ़ाइलें/फ़ंक्शन महत्वपूर्ण योगदान दें। यह सुनिश्चित करने के लिए कि ऐरे एक्सेस सुरक्षित हैं, इन फ़ाइलों/फ़ंक्शंस का मैन्युअल रूप से ऑडिट करें। अतिरिक्त विवरण के लिए समस्या निवारण देखें।

बाउंडसैन को अक्षम करना

आप ब्लॉकलिस्ट या फ़ंक्शन विशेषताओं के साथ फ़ंक्शंस और स्रोत फ़ाइलों में बाउंडसैन को अक्षम कर सकते हैं। बाउंडसैन को सक्षम रखना सबसे अच्छा है, इसलिए इसे केवल तभी अक्षम करें जब फ़ंक्शन या फ़ाइल बड़ी मात्रा में प्रदर्शन ओवरहेड बना रही हो और स्रोत की मैन्युअल रूप से समीक्षा की गई हो।

फ़ंक्शन विशेषताओं और ब्लॉकलिस्ट फ़ाइल फ़ॉर्मेटिंग के साथ बाउंडसन को अक्षम करने के बारे में अधिक जानकारी के लिए, क्लैंग एलएलवीएम दस्तावेज़ देखें। अन्य सैनिटाइज़र को प्रभावित करने से बचने के लिए लक्ष्य सैनिटाइज़र को निर्दिष्ट करने वाले अनुभाग नामों का उपयोग करके विशेष सैनिटाइज़र को ब्लॉकलिस्टिंग का दायरा दें।

मान्यकरण

बाउंडसन के लिए विशेष रूप से कोई सीटीएस परीक्षण नहीं है। इसके बजाय, यह सुनिश्चित करें कि सीटीएस परीक्षण बाउंडसैन सक्षम के साथ या उसके बिना भी पास हो जाएं ताकि यह सत्यापित किया जा सके कि यह डिवाइस को प्रभावित नहीं कर रहा है।

समस्या निवारण

बाउंडसैन को सक्षम करने के बाद घटकों का पूरी तरह से परीक्षण करें ताकि यह सुनिश्चित हो सके कि पहले से ज्ञात किसी भी आउट-ऑफ-बाउंड एक्सेस का समाधान हो गया है।

बाउंडसैन त्रुटियों को आसानी से पहचाना जा सकता है क्योंकि उनमें निम्नलिखित टॉम्बस्टोन गर्भपात संदेश शामिल है:

    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]'