معقّم HWAddress

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

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

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

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

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

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

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

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

نموذج تطبيق كيفية ضبط صيغة إصدار من أجل حسان.

إنشاء

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

لعبة 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

إنشاء فيديوهات Shorts

في ملف 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 script لتشغيل تطبيقك القابل لتصحيح الأخطاء على أي جهاز يعمل بنظام التشغيل Android بإمكانك تخطّي هذه الخطوة إذا اخترت اتّباع الخطوات. في تعليمات الإعداد.

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

#!/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)

قد تتبع الرسالة معلومات إضافية حول تصحيح الأخطاء، بما في ذلك قائمة بسلاسل المحادثات المباشرة في التطبيق وعلامات تخصيصات الذاكرة القريبة قيم تسجيل وحدة المعالجة المركزية (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 من Android لتشغيل تطبيقات HWASan. يمكنك تثبيت صور HWASan المنشأة مسبقًا على أجهزة Pixel المتوافقة. تتميز الإصدارات المتاحة على ci.android.com، حيث يمكنك النقر على المربّع التي تريد الحصول على رابط الإصدار Flash Build فيها بالضبط. يتطلب ذلك أن تعرف الاسم الرمزي لهاتفك

وميض إصدار جهاز

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

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

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

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

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

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

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