HWAddress सैनिटाइज़र

Android एनडीके, HWAddress Sanitizer के साथ काम करता है. इसे HWASan भी कहा जाता है. यह सुविधा, एनडीके r21 और Android 10 (एपीआई लेवल 29) से शुरू हुई है. HWASan सिर्फ़ 64-बिट Arm डिवाइसों पर उपलब्ध है.

HWASan, ASan जैसा ही एक मेमोरी गड़बड़ी का पता लगाने वाला टूल है. क्लासिक ASan की तुलना में, HWASan में ये सुविधाएं हैं:

  • सीपीयू का ओवरहेड मिलता-जुलता है (~2x)
  • मिलते-जुलते कोड साइज़ का ओवरहेड (40 – 50%)
  • रैम का इस्तेमाल बहुत कम होता है (10% – 35%)

HWASan, ASan की तरह ही बग का पता लगाता है:

  • स्टैक और हेप बफ़र ओवरफ़्लो या अंडरफ़्लो
  • फ़्री होने के बाद हीप का इस्तेमाल
  • स्कोप के बाहर स्टैक का इस्तेमाल करना
  • डबल फ़्री या वाइल्ड फ़्री

इसके अलावा, HWASan इनका भी पता लगाता है:

  • फ़ंक्शन से बाहर निकलने के बाद स्टैक का इस्तेमाल

Sample App

सैंपल ऐप्लिकेशन में, hwasan के लिए बिल्ड वैरिएंट को कॉन्फ़िगर करने का तरीका बताया गया है.

बनाएं

HWAddress Sanitizer की मदद से, अपने ऐप्लिकेशन का नेटिव (JNI) कोड बनाने के लिए, यह तरीका अपनाएं:

ndk-build

अपनी Application.mk फ़ाइल में:

APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress

CMake

अपने मॉड्यूल की build.gradle फ़ाइल में:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

CMakeLists.txt में मौजूद हर टारगेट के लिए:

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

NDK 27 या उसके बाद के वर्शन में, build.gradle में इनका भी इस्तेमाल किया जा सकता है और आपको CMakeLists.txt में बदलाव करने की ज़रूरत नहीं है:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false का इस्तेमाल करने पर, यह सुविधा काम नहीं करेगी.

Android 14 या इसके बाद के वर्शन: wrap.sh जोड़ें

अगर आपके डिवाइस में Android 14 या इसके बाद का वर्शन है, तो wrap.sh स्क्रिप्ट का इस्तेमाल करके, डीबग किए जा सकने वाले ऐप्लिकेशन को किसी भी Android डिवाइस पर चलाया जा सकता है. अगर आपने सेटअप के निर्देशों में दिया गया तरीका अपनाने का विकल्प चुना है, तो इस चरण को छोड़ा जा सकता है.

arm64-v8a के लिए, यहां दी गई wrap.sh स्क्रिप्ट जोड़ने के लिए, wrap.sh स्क्रिप्ट को पैकेज करने के निर्देशों का पालन करें.

#!/system/bin/sh
LD_HWASAN=1 exec "$@"

चलाएं

अगर आपका ऐप्लिकेशन Android 14 से पहले के वर्शन पर चल रहा है या आपने wrap.sh स्क्रिप्ट नहीं जोड़ी है, तो ऐप्लिकेशन चलाने से पहले सेटअप करने के निर्देश का पालन करें.

ऐप्लिकेशन को हमेशा की तरह चलाएं. मेमोरी से जुड़ी गड़बड़ी का पता चलने पर, ऐप्लिकेशन SIGABRT के साथ क्रैश हो जाता है और Logcat में ज़्यादा जानकारी वाला मैसेज प्रिंट करता है. मैसेज की कॉपी, /data/tombstones में मौजूद फ़ाइल में मिल सकती है. यह इस तरह दिखती है:

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

इस मैसेज के बाद, डीबग करने से जुड़ी अतिरिक्त जानकारी दिख सकती है. इसमें, ऐप्लिकेशन में लाइव थ्रेड की सूची, आस-पास के मेमोरी ऐलोकेशन के टैग, और सीपीयू रजिस्टर की वैल्यू शामिल हैं.

HWASan से जुड़ी गड़बड़ी के मैसेज के बारे में ज़्यादा जानने के लिए, एचडब्ल्यूएएसएन रिपोर्ट को समझना लेख पढ़ें.

कमांड-लाइन से चलाए जा सकने वाले प्रोग्राम बनाना

Android 14 और उसके बाद के वर्शन पर, HWASan की मदद से इंस्ट्रूमेंट किए गए, रन किए जा सकने वाले प्रोग्राम बनाए और चलाए जा सकते हैं. ndk-build या CMake के लिए, उसी कॉन्फ़िगरेशन का इस्तेमाल किया जा सकता है जिसे बिल्ड में बताया गया है. Android 14 या इसके बाद के वर्शन पर काम करने वाले डिवाइस पर, रन किए जा सकने वाले प्रोग्राम को पुश करें और शेल का इस्तेमाल करके, उसे सामान्य तरीके से चलाएं.

libc++ का इस्तेमाल करने पर, पक्का करें कि आपने शेयर किए गए STL का इस्तेमाल किया हो. साथ ही, उसे डिवाइस पर पुश करें और अपनी बाइनरी को चलाते समय, LD_LIBRARY_PATH को उस डायरेक्ट्री पर सेट करें जिसमें वह मौजूद है.

अगर Gradle का इस्तेमाल नहीं किया जा रहा है, तो CMake और ndk-build की मदद से कमांड लाइन से बिल्ड करने का तरीका जानने के लिए, NDK दस्तावेज़ देखें.

Android 13 या उससे पहले के वर्शन: सेटअप

अगर आपके डिवाइस में Android 14 या इसके बाद का वर्शन है, तो इस चरण को छोड़ा जा सकता है. इसके बाद, बिल्ड सेक्शन में जाकर, wrap.sh का इस्तेमाल करने के लिए दिए गए निर्देशों का पालन करें. आपके पास इस सेक्शन में दिया गया तरीका अपनाने और wrap.sh का इस्तेमाल करने के निर्देशों को छोड़ने का विकल्प भी है.

Android 14 से पहले, HWASan ऐप्लिकेशन को Android के HWASan वर्शन पर चलने की ज़रूरत होती है. HWASan की सुविधा वाले Pixel डिवाइसों पर, पहले से बनी इमेज फ़्लैश की जा सकती हैं. ये बिल्ड, ci.android.com पर उपलब्ध हैं. यहां आपको जिस बिल्ड का फ़्लैश बिल्ड लिंक चाहिए उसके स्क्वेयर पर क्लिक करें. इसके लिए, आपको अपने फ़ोन का कोडनेम पता होना चाहिए.

डिवाइस का बिल्ड फ़्लैश करना

इसके बजाय, सीधे flash.android.com पर जाना आसान हो सकता है. ऐसा इसलिए, क्योंकि वहां आपके डिवाइस का पता लगाने के साथ ही प्रोसेस शुरू हो जाती है. साथ ही, आपको सिर्फ़ वे बिल्ड दिखते हैं जिनका इस्तेमाल किया जा सकता है. नीचे दी गई इमेज में, इस टूल में सेटअप फ़्लो के बारे में बताया गया है.

अपने डिवाइस पर डेवलपर मोड चालू करें और यूएसबी केबल का इस्तेमाल करके, उसे अपने कंप्यूटर से कनेक्ट करें. नया डिवाइस जोड़ें पर क्लिक करें. इसके बाद, डायलॉग बॉक्स से अपना डिवाइस चुनें और कनेक्ट करें पर क्लिक करें.

फ़्लैश करने के लिए डिवाइस का पता लगाना वह डिवाइस चुनें जिससे कनेक्ट करना है

डिवाइस कनेक्ट होने के बाद, बिल्ड को कॉन्फ़िगर करने के लिए उस पर क्लिक करें. कोई बिल्ड आईडी चुनें बॉक्स में, aosp-master-with-phones-throttled शाखा चुनें. इससे, कनेक्ट किए गए डिवाइस के लिए सही इमेज अपने-आप चुनी जाएगी.

फ़्लैश करने के लिए डिवाइस चुनना फ़्लैश करने के विकल्पों की पुष्टि करना और डिवाइस को फ़्लैश करना

अपने डिवाइस को फ़्लैश करने के लिए, इंस्टॉल करें पर क्लिक करें.

ज़रूरी सेट अप के बारे में ज़्यादा जानकारी के लिए, Android Flash Tool के दस्तावेज़ देखें. इसके अलावा, सोर्स से HWASan इमेज बनाने के निर्देशों के लिए, AOSP दस्तावेज़ देखें.