UnspecifiedBehavior Sanitizer (UBSan) जांच के दौरान कंपाइल-टाइम इंस्ट्रुमेंटेशन करता है कई तरह के अस्पष्ट व्यवहार की जांच करें. हालांकि, UBSan पता लगा रहा है कई तय नहीं की गई व्यवहार से जुड़ी गड़बड़ियां के लिए, Android इनके साथ काम करता है:
- अलाइनमेंट
- बूल
- सीमाएं
- Enum
- फ़्लोट-कास्ट-ओवरफ़्लो
- शून्य से अलग-अलग फ़्लोट करें
- पूर्णांक से शून्य से भाग दें
- नॉन-शून्य-एट्रिब्यूट
- खाली
- रिटर्न स्टेटमेंट
- नॉन-शून्य-एट्रिब्यूट दिखाता है
- शिफ़्ट-बेस
- शिफ़्ट-घातांक
- साइन इन-इंटीजर-ओवरफ़्लो
- पहुंच में नहीं
- अहस्ताक्षरित-पूर्णांक-ओवरफ़्लो
- व्ला-बाउंड
अनसाइन्ड-इंटीजर-ओवरफ़्लो, जबकि तकनीकी रूप से अनिर्धारित नहीं है सैनिटाइज़र में शामिल होती है और कई Android मॉड्यूल में इस्तेमाल की जाती है, इसमें मीडिया सर्वर कॉम्पोनेंट शामिल हैं, ताकि लेटेंट इंटीजर-ओवरफ़्लो को हटाया जा सके जोखिम की आशंकाएं.
लागू करना
Android बिल्ड सिस्टम में, 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", ], }, }, }
UBSan के शॉर्टकट
Android में दो शॉर्टकट भी हैं, 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 के साथ किया जा सकता है,
जबकि default-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')
इंटिज़र ओवरफ़्लो सैनिटाइज़ेशन
अनचाहे पूर्णांक ओवरफ़्लो की वजह से मेमोरी खराब हो सकती है या जानकारी मिल सकती है मेमोरी के ऐक्सेस से जुड़े वैरिएबल में, ज़ाहिर करने से जुड़े जोखिम की आशंकाएं या मेमोरी का बंटवारा. इससे निपटने के लिए, हमने Clang की अनिर्धारितव्यवहार सैनिटाइज़र (UBSan) इस पर हस्ताक्षर किया गया और अहस्ताक्षरित पूर्णांक ओवरफ़्लो सैनिटाइज़र्स के लिए सेट किया गया: हार्डन मीडिया फ़्रेमवर्क Android 7.0 में उपलब्ध है. Android 9 में, बड़ा किया गया UBSan में ज़्यादा कॉम्पोनेंट शामिल किए गए हैं और इसके लिए बिल्ड सिस्टम के साथ काम करने की बेहतर सुविधा दी गई है.
इसे अंकगणित के चारों ओर चेक जोड़ने के लिए डिज़ाइन किया गया है ऑपरेशन&हायर्सप;/&हायर्सp;निर्देश—जिसमें ओवरफ़्लो—इसका इस्तेमाल करके, ओवरफ़्लो होने पर प्रोसेस को सुरक्षित तरीके से रद्द किया जा सकता है. ये सैनिटाइज़र, मेमोरी में होने वाले गड़बड़ियों को कम कर सकते हैं जानकारी ज़ाहिर करने से जुड़े जोखिम की आशंकाएं, जिसकी असल वजह कोई पूर्णांक है ओवरफ़्लो, जैसे कि मूल Statefright के जोखिम की आशंका.
उदाहरण और सोर्स
इंटिज़र ओवरफ़्लो सैनिटाइज़ेशन (IntSan), कंपाइलर की ओर से दिया जाता है और
अंकगणित का पता लगाने के लिए, कंपाइलेशन के समय बाइनरी में इंस्ट्रुमेंटेशन
ओवरफ़्लो. यह सेटिंग, पूरे सिस्टम में मौजूद अलग-अलग कॉम्पोनेंट में डिफ़ॉल्ट रूप से चालू रहती है
प्लैटफ़ॉर्म, उदाहरण के लिए
/platform/external/libnl/Android.bp
.
लागू करना
IntSan, UBSan के हस्ताक्षर किए हुए और बिना हस्ताक्षर वाले पूर्णांक ओवरफ़्लो सैनिटाइज़र का इस्तेमाल करता है. यह हर मॉड्यूल के लेवल पर, खतरों को कम करने की सुविधा चालू है. इसकी मदद से, अहम कॉम्पोनेंट को सुरक्षित रखें और उसे बंद न करें.
हमारी सलाह है कि आप Integer ओवरफ़्लो सैनिटाइज़ेशन की सुविधा को चालू करें, ताकि कॉम्पोनेंट. सबसे बेहतर उम्मीदवार वे हैं जिन्हें खास अधिकारों वाला नेटिव कोड या नेटिव कोड के तौर पर इस्तेमाल किया जाता है गैर-भरोसेमंद उपयोगकर्ता इनपुट को पार्स करता है. परफ़ॉर्मेंस का एक छोटा ओवरहेड जुड़ा है सैनिटाइज़र के साथ काम करता है, जो कोड के इस्तेमाल और गड़बड़ी की मौजूदगी पर निर्भर करता है अंकगणितीय संक्रियाएं. छोटे ओवरहेड प्रतिशत की उम्मीद करें और जांचें कि अगर विज्ञापनों की परफ़ॉर्मेंस पर असर पड़ता है.
मेकफ़ाइल में IntSan की मदद करना
किसी मेकफ़ाइल में IntSan को चालू करने के लिए, यह जोड़ें:
LOCAL_SANITIZE := integer_overflow # Optional features LOCAL_SANITIZE_DIAG := integer_overflow LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
LOCAL_SANITIZE
, सैनिटाइज़र की ऐसी सूची लेता है जिसे कॉमा लगाकर अलग किया गया है, जिसमेंinteger_overflow
विकल्पों का प्री-पैकेज सेट है साइन इन किए हुए और बिना हस्ताक्षर वाले इंटीजर ओवरफ़्लो सैनिटाइज़र्स डिफ़ॉल्ट ब्लॉकलिस्ट.LOCAL_SANITIZE_DIAG
इनके लिए डाइग्नोस्टिक्स मोड चालू करता है: सैनिटाइज़र. जांच के दौरान ही डाइग्नोस्टिक्स मोड का इस्तेमाल करें, क्योंकि इससे ऐसा नहीं होगा ओवरफ़्लो होने पर रद्द करते हैं, जिससे खतरों को कम करने की कोशिश कर रहे हैं. समस्या का हल देखें पर जाएं.LOCAL_SANITIZE_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
प्रॉपर्टी पहले से पैक की गई है
साइन किए गए और साइन नहीं किए गए पूर्णांक ओवरफ़्लो के लिए, विकल्पों का सेट
डिफ़ॉल्ट सेटिंग वाले सैनिटाइज़र
ब्लॉकलिस्ट.
प्रॉपर्टी का 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", },अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
समस्या का हल
अगर नए कॉम्पोनेंट में इंटीजर ओवरफ़्लो सैनिटाइज़ेशन की सुविधा चालू की जा रही है या इन चीज़ों पर भरोसा किया जा सकता है ऐसी प्लैटफ़ॉर्म लाइब्रेरी जिनमें इंटीजर ओवरफ़्लो सैनिटाइज़ेशन हों, तो आपको बिनाइन इंटीजर ओवरफ़्लो की कुछ समस्याएं, जिनकी वजह से अब शर्तों को पूरा नहीं किया जा सकता. आपको टेस्ट करना चाहिए सैनिटाइज़ेशन वाले कॉम्पोनेंट चालू करके, यह पक्का किया जाता है कि बाहरी ओवरफ़्लो को दिखाया जा सके.
यह पता लगाने के लिए, उपयोगकर्ता के बिल्ड में सैनिटाइज़ेशन की वजह से रद्द होता है, इसके लिए खोजें
रद्द करें मैसेज वाला SIGABRT
क्रैश, इससे पता चलता है कि ओवरफ़्लो का पता चला है
UBSan से, जैसे:
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')
समस्या वाले अंकगणितीय ऑपरेशन का पता लगाने के बाद पक्का करें कि आसान और उम्मीद के मुताबिक हो. उदाहरण के लिए, सुरक्षा से जुड़ी कोई समस्या नहीं है. आप सैनिटाइज़र ने रद्द किया:
- ओवरफ़्लो से बचने के लिए कोड को रीफ़ैक्टर करना (उदाहरण)
- साफ़ तौर पर Clang के __builtin_*_overflow के ज़रिए ओवरफ़्लो होता है फ़ंक्शन (उदाहरण)
no_sanitize
एट्रिब्यूट की वैल्यू देकर, फ़ंक्शन में सैनिटाइज़ेशन की सुविधा बंद करना (उदाहरण)- BlockLIST फ़ाइल के ज़रिए किसी फ़ंक्शन या सोर्स फ़ाइल के सैनिटाइज़ेशन को बंद करना (उदाहरण)
आपको सबसे बेहतर समाधान का इस्तेमाल करना चाहिए. उदाहरण के लिए, कई अंकगणितीय संक्रियाओं और एक ओवरफ़्लो संक्रिया वाला फ़ंक्शन पूरे फ़ंक्शन के बजाय एक ही ऑपरेशन को रीफ़ैक्टर किया जाना चाहिए ब्लॉक सूची में शामिल किया गया.
सामान्य ओवरफ़्लो की वजह से ये पैटर्न हो सकते हैं:
- इंप्लिसिट कास्ट करता है, जहां साइन किए गए टाइप में कास्ट किए जाने से पहले, बिना साइन वाला ओवरफ़्लो होता है (उदाहरण)
- लिंक की गई सूची को मिटाने पर, लूप का इंडेक्स कम हो जाता है (उदाहरण)
- असल सबसे बड़ी वैल्यू बताने के बजाय, -1 को साइन नहीं किया गया टाइप असाइन करना (उदाहरण)
- लूप में चलाएं, जो शर्त में साइन नहीं किए गए पूर्णांक को कम कर देता है (उदाहरण, उदाहरण)
हमारा सुझाव है कि डेवलपर यह पक्का करें कि ऐसे मामले जहां सैनिटाइज़र यह ऐसा ओवरफ़्लो होता है जिसमें कोई अनजाने में बुरा असर या सुरक्षा नहीं होती. साफ़ करने के तरीके को बंद करने से पहले कुछ ज़रूरी शर्तों का पालन करना होगा.
IntSan को बंद करें
BlockLIST या फ़ंक्शन एट्रिब्यूट का इस्तेमाल करके IntSan को बंद किया जा सकता है. समय-समय पर बंद करें और सिर्फ़ तब, जब कोड में बदलाव करने की ज़रूरत न हो या अगर ऐसा है परफ़ॉर्मेंस ओवरहेड की वजह से हुआ हो.
IntSan को बंद करने के बारे में ज़्यादा जानकारी के लिए, अपस्ट्रीम Clang दस्तावेज़ देखें फ़ंक्शन के साथ एट्रिब्यूट और ब्लॉकLIST फ़ाइल फ़ॉर्मैट करें. ब्लॉकलिस्टिंग का दायरा टारगेट सैनिटाइज़र के बारे में बताने वाले सेक्शन के नामों का इस्तेमाल करना सैनिटाइज़र.
पुष्टि करें
फ़िलहाल, खास तौर पर Integer ओवरफ़्लो सैनिटाइज़ेशन के लिए कोई सीटीएस टेस्ट उपलब्ध नहीं है. इसके बजाय, यह पक्का करें कि सीटीएस टेस्ट में, IntSan को चालू करके या पुष्टि करने के लिए, उसे चालू किए बिना पास किया गया हो कि इसका डिवाइस पर कोई असर नहीं पड़ रहा हो.
बाउंड सैनिटाइज़ेशन
BoundsSanitizer (BoundSan), सीमाएं शामिल करने के लिए बाइनरी में इंस्ट्रुमेंटेशन जोड़ता है अरे ऐक्सेस की जांच करता है. अगर कंपाइलर यह नहीं कर पाता है, तो ये जांच जोड़ दी जाती हैं कंपाइल करते समय साबित करें कि ऐक्सेस सुरक्षित रहेगा और अगर अरे का साइज़ को रनटाइम पर पता चल जाएगा, ताकि इसकी जाँच की जा सके. Android 10, BoundSan को ब्लूटूथ और कोडेक. BoundSan, कंपाइलर की ओर से उपलब्ध कराता है और इसे चालू करता है इस प्लैटफ़ॉर्म पर डिफ़ॉल्ट रूप से अलग-अलग कॉम्पोनेंट इस्तेमाल करते हैं.
लागू करना
BoundSan, UBSan's का इस्तेमाल करता है सैनिटाइज़र को सीमित कर देता है. जोखिम को कम करने की यह प्रोसेस, हर मॉड्यूल के लेवल पर चालू है. इससे मदद मिलती है Android के अहम कॉम्पोनेंट सुरक्षित रखें और उन्हें बंद न करें.
हमारा सुझाव है कि आप अतिरिक्त कॉम्पोनेंट के लिए, BoundSan को चालू करें. सबसे बेहतर उम्मीदवार वे हैं जिन्हें खास अधिकार वाला नेटिव कोड या पार्स करने वाला कॉम्प्लेक्स नेटिव कोड माना जाता है उपयोगकर्ता का इनपुट भरोसेमंद नहीं है. BoundSan को चालू करने से जुड़ा परफ़ॉर्मेंस ओवरहेड का डेटा, उन अरे ऐक्सेस की संख्या पर निर्भर करता है जिन्हें सुरक्षित नहीं माना जा सकता. औसत रूप से छोटा ओवरहेड प्रतिशत. साथ ही, जांच करें कि क्या परफ़ॉर्मेंस की चिंता है.
ब्लूप्रिंट फ़ाइलों में BoundSan को चालू करें
ब्लूप्रिंट फ़ाइलों में "bounds"
को जोड़कर BoundSan को चालू किया जा सकता है
misc_undefined
में, बाइनरी और लाइब्रेरी के लिए प्रॉपर्टी को साफ़ करें
मॉड्यूल:
sanitize: { misc_undefined: ["bounds"], diag: { misc_undefined: ["bounds"], }, BLOCKLIST: "modulename_BLOCKLIST.txt",
डायग
diag
प्रॉपर्टी की मदद से, सैनिटाइज़र के लिए गड़बड़ी की जानकारी वाला मोड चालू हो जाता है.
जांच के दौरान ही डाइग्नोस्टिक्स मोड का इस्तेमाल करें. डाइग्नोस्टिक्स मोड चालू नहीं है
ओवरफ़्लो, जिससे सुरक्षा से जुड़े जोखिमों को कम किया जाता है और
ज़्यादा परफ़ॉर्मेंस होती है, इसलिए प्रोडक्शन बिल्ड के लिए इसका सुझाव नहीं दिया जाता है.
ब्लॉकलिस्ट
BLOCKLIST
प्रॉपर्टी, BlockLIST के स्पेसिफ़िकेशन की अनुमति देती है
ऐसी फ़ाइल जिसकी मदद से डेवलपर, फ़ंक्शन और सोर्स फ़ाइलों को
साफ़ किया गया. इस प्रॉपर्टी का इस्तेमाल सिर्फ़ तब करें, जब परफ़ॉर्मेंस पर कोई असर हो और टारगेट किया गया हो
फ़ाइलों/फ़ंक्शन का अहम योगदान होता है. इन फ़ाइलों या फ़ंक्शन को मैन्युअल तरीके से ऑडिट करें
ताकि यह पक्का किया जा सके कि अरे ऐक्सेस सुरक्षित है. ज़्यादा जानकारी के लिए, समस्या का हल लेख पढ़ें
विवरण.
मेकफ़ाइल में BoundSan को चालू करें
BoundSan को "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 को बंद करें
blockLIST की मदद से, BoundSan को फ़ंक्शन और सोर्स फ़ाइलों में बंद किया जा सकता है या फ़ंक्शन एट्रिब्यूट का इस्तेमाल करें. BoundSan को चालू रखना सबसे अच्छा होता है, इसलिए इसे बंद करें, अगर फ़ंक्शन या फ़ाइल बहुत ज़्यादा परफ़ॉर्मेंस ओवरहेड बना रही हो और स्रोत की मैन्युअल रूप से समीक्षा की गई.
फ़ंक्शन के साथ BoundSan को बंद करने के बारे में ज़्यादा जानकारी के लिए एट्रिब्यूट और ब्लॉकLIST फ़ाइल फ़ॉर्मैटिंग के लिए, Clang LLVM का दस्तावेज़ देखें. स्कोप सैनिटाइज़र को ब्लॉकलिस्ट करने के लिए, सैनिटाइज़र को टारगेट करें, ताकि दूसरे सैनिटाइज़र पर असर न पड़े.
पुष्टि करें
खास तौर पर BoundSan के लिए, कोई CTS टेस्ट नहीं है. इसके बजाय, पक्का करें कि सीटीएस BoundSan को चालू करके या बिना, यह पुष्टि करता है कि इससे कोई फ़र्क़ नहीं पड़ता डिवाइस.
समस्या का हल
BoundSan को चालू करने के बाद, कॉम्पोनेंट की अच्छी तरह से जांच करें. इससे यह पक्का किया जा सकेगा कि पहले ऐसी समस्याएं जिनका पता नहीं लगाया गया है उन्हें हल किया जाता है.
BoundSan गड़बड़ियों को आसानी से पहचाना जा सकता है, क्योंकि उनमें ये शामिल हैं समाधि रद्द करने का संदेश:
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]'