معقّم HWAddress

يتوافق Android NDK مع HWAddress Sanitizer، والمعروف أيضًا باسم HWASan، بدءًا من NDK r21 وAndroid 10 (مستوى واجهة برمجة التطبيقات 29). يتوفر HWASan فقط على أجهزة Arm 64 بت.

HWASan هي أداة لاكتشاف أخطاء الذاكرة تشبه ASan. بالمقارنة مع نظام ASan الكلاسيكي، تمتع HWASan بما يلي:

  • أعباء العمل نفسها على وحدة المعالجة المركزية (CPU) (مرّتان تقريبًا)
  • النفقات العامة بحجم الرمز البرمجي (من 40 إلى %50)
  • أعباء زائدة على ذاكرة الوصول العشوائي (RAM) أصغر بكثير (من 10% إلى 35%)

يرصد HWASan مجموعة الأخطاء نفسها التي رصدها ASan:

  • فائض سعة المخزن المؤقت والتخزين المؤقت أو التخزين المؤقت
  • استخدام الذاكرة بعد انتهاء الفترة التجريبية المجانية
  • استخدام التكدس خارج النطاق
  • ألعاب محاكاة مزدوجّة أو حرّة

بالإضافة إلى ذلك، ترصد خدمة HWASan أيضًا ما يلي:

  • استخدام التكدس بعد الإرجاع

نموذج التطبيق

يعرض نموذج التطبيق كيفية إعداد نسخة مختلفة من hhasan.

زيادة التشويق

لإنشاء الرمز البرمجي الأصلي (JNI) لتطبيقك باستخدام HWAddress Sanitizer، اتّبِع الخطوات التالية:

إنشاء ndk

في ملف 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

الإنشاء

في ملف 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)

الإصدار 14 من نظام Android أو إصدار أحدث: أضِف wrap.sh.

إذا كنت تستخدم الإصدار 14 من نظام التشغيل Android أو إصدارًا أحدث، يمكنك استخدام نص برمجي wrap.sh لتشغيل التطبيق القابل للتصحيح على أي جهاز يعمل بنظام التشغيل Android. يمكنك تخطي هذه الخطوة إذا اخترت اتّباع الخطوات الواردة في تعليمات الإعداد.

اتّبِع التعليمات لحزمة نص wrap.sh البرمجي لإضافة نص wrap.sh التالي في arm64-v8a.

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

إجراء الفحص

إذا كنت تستخدم إصدار Android أقدم من 14 أو لم تضِف نص wrap.sh، يُرجى اتّباع تعليمات الإعداد قبل تشغيل التطبيق.

شغِّل التطبيق كالمعتاد. عند اكتشاف خطأ في الذاكرة، يتعطل أحد التطبيقات مع SIGABRT ويطبع رسالة مفصلة لتسجيل الدخول. يمكن العثور على نسخة من الرسالة في ملف ضمن /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)

قد تُتبع الرسالة معلومات إضافية لتصحيح الأخطاء، بما في ذلك قائمة سلاسل المحادثات المباشرة في التطبيق وعلامات تخصيص الذاكرة القريبة وقيم سجلّ وحدة المعالجة المركزية (CPU).

يُرجى مراجعة فهم تقارير HWASan للحصول على مزيد من المعلومات حول رسائل خطأ HWASan.

إنشاء ملفات تنفيذية لسطر الأوامر

يمكنك إنشاء ملفات تنفيذية وتشغيلها باستخدام تطبيق HWASan على نظام التشغيل Android 14 والإصدارات الأحدث. يمكنك استخدام الإعدادات نفسها كما هو موضَّح في إنشاء لـ ndk-build أو CMake للملفات التنفيذية. ادفع الملفات التنفيذية إلى جهاز يعمل بنظام التشغيل Android 14 أو إصدار أحدث وشغِّله كالمعتاد باستخدام واجهة الأوامر.

إذا كنت تستخدم libc++ ، تأكّد من استخدام STL المشتركة ودفعها إلى الجهاز وضبط LD_LIBRARY_PATH على الدليل الذي يحتوي عليه عند تشغيل البرنامج الثنائي.

إذا كنت لا تستخدم Gradle، يمكنك الاطّلاع على مستندات NDK للتعرّف على كيفية الإنشاء من سطر الأوامر باستخدام CMake وndk-build.

نظام التشغيل Android 13 أو الإصدارات الأقدم: الإعداد

إذا كان جهازك يعمل بنظام التشغيل Android 14 أو إصدار أحدث، يمكنك تخطّي هذه الخطوة واتّباع تعليمات استخدام wrap.sh في قسم إنشاء أدناه. يمكنك أيضًا اختيار اتباع هذا القسم وتخطي تعليمات استخدام wrap.sh أدناه.

قبل استخدام Android 14، تحتاج تطبيقات HWASan إلى إصدار HWASan من Android حتى تعمل. يمكنك تثبيت صور HWASan المُنشأة مسبقًا على أجهزة Pixel المتوافقة. وتتوفر الإصدارات على ci.android.com، حيث يمكنك النقر على المربع للحصول على الإصدار المحدد الذي تريده للحصول على رابط إصدار Flash. يتطلب ذلك منك معرفة الاسم الرمزي لهاتفك.

الفلاش إلى إصدار الجهاز

بدلاً من ذلك، قد يكون من الأسهل الانتقال مباشرةً إلى flash.android.com لأنّ المسار يبدأ برصد جهازك ويعرض فقط الإصدارات التي يمكنك استخدامها. توضّح الصور التالية عملية الإعداد في هذه الأداة.

مكِّن وضع مطور البرامج على جهازك ووصِّله بجهاز الكمبيوتر باستخدام كابل USB. انقر على إضافة جهاز جديد، واختر جهازك من مربع الحوار، ثم انقر على اتصال.

رصد جهاز لتشغيل الفلاش اختيار الجهاز المطلوب الاتصال به

بعد توصيل الجهاز، انقر عليه لإعداد الإصدار. في المربّع اختيار رقم تعريف الإصدار، اختَر الفرع aosp-master-with-phones-throttled لاختيار الصورة الصحيحة تلقائيًا للجهاز الذي تم توصيله.

اختَر الجهاز الذي تريد وميض الفلاش تأكيد خيارات الفلاش ووميض الجهاز

انقر على تثبيت لتثبيت برنامج فلاش على جهازك.

يمكنك الاطّلاع على مزيد من التفاصيل حول عملية الإعداد اللازمة في مستندات أداة الفلاش على Android. بدلاً من ذلك، يمكنك مراجعة وثائق AOSP للحصول على تعليمات لإنشاء صورة HWASan من المصدر.