এপিআই লেভেল ২৭ (অ্যান্ড্রয়েড ও এমআর ১) থেকে অ্যান্ড্রয়েড এনডিকে অ্যাড্রেস স্যানিটাইজার (যা এস্যান নামেও পরিচিত) সমর্থন করে।
ASan হলো নেটিভ কোডে মেমরি বাগ শনাক্ত করার জন্য একটি দ্রুত কম্পাইলার-ভিত্তিক টুল। ASan যা যা শনাক্ত করে:
- স্ট্যাক এবং হিপ বাফার ওভারফ্লো/আন্ডারফ্লো
- বিনামূল্যে ব্যবহারের পর প্রচুর ব্যবহার।
- স্কোপের বাইরে স্ট্যাক ব্যবহার
- ডাবল ফ্রি/ওয়াইল্ড ফ্রি
ASan-এর সিপিইউ ওভারহেড প্রায় ২x, কোড সাইজ ওভারহেড ৫০% থেকে ২x-এর মধ্যে এবং মেমরি ওভারহেড অনেক বেশি (যা আপনার অ্যালোকেশন প্যাটার্নের উপর নির্ভরশীল, তবে প্রায় ২x-এর কাছাকাছি)।
নমুনা অ্যাপ
একটি নমুনা অ্যাপে দেখানো হয়েছে কিভাবে asan-এর জন্য একটি বিল্ড ভ্যারিয়েন্ট কনফিগার করতে হয়।
নির্মাণ করুন
Address Sanitizer ব্যবহার করে আপনার অ্যাপের নেটিভ (JNI) কোড বিল্ড করতে, নিম্নলিখিতগুলি করুন:
এনডিকে-বিল্ড
আপনার Application.mk-তে:
APP_STL := c++_shared # Or system, or none.
APP_CFLAGS := -fsanitize=address -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=address
আপনার Android.mk-এর প্রতিটি মডিউলের জন্য:
LOCAL_ARM_MODE := arm
CMake
আপনার মডিউলের build.gradle-এ:
android {
defaultConfig {
externalNativeBuild {
cmake {
// Can also use system or none as ANDROID_STL.
arguments "-DANDROID_ARM_MODE=arm", "-DANDROID_STL=c++_shared"
}
}
}
}
আপনার CMakeLists.txt-এর প্রতিটি টার্গেটের জন্য:
target_compile_options(${TARGET} PUBLIC -fsanitize=address -fno-omit-frame-pointer)
set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -fsanitize=address)
দৌড়
অ্যান্ড্রয়েড ও এমআর১ (এপিআই লেভেল ২৭) থেকে শুরু করে, একটি অ্যাপ্লিকেশন একটি র্যাপ শেল স্ক্রিপ্ট প্রদান করতে পারে যা অ্যাপ্লিকেশন প্রসেসটিকে র্যাপ বা প্রতিস্থাপন করতে পারে। এটি একটি ডিবাগযোগ্য অ্যাপ্লিকেশনকে তার অ্যাপ্লিকেশন স্টার্টআপ কাস্টমাইজ করার সুযোগ দেয়, যা প্রোডাকশন ডিভাইসগুলিতে ASan ব্যবহার সক্ষম করে।
- অ্যাপ্লিকেশন ম্যানিফেস্টে
android:debuggableযোগ করুন। - আপনার অ্যাপের
build.gradleফাইলেuseLegacyPackagingtrueতে সেট করুন। আরও তথ্যের জন্য র্যাপ শেল স্ক্রিপ্ট গাইডটি দেখুন। - আপনার অ্যাপ মডিউলের
jniLibsএ ASan রানটাইম লাইব্রেরিটি যোগ করুন। আপনার
src/main/resources/libডিরেক্টরির প্রতিটি ডিরেক্টরিতে নিম্নলিখিত বিষয়বস্তু সহwrap.shফাইল যোগ করুন।#!/system/bin/sh HERE="$(cd "$(dirname "$0")" && pwd)" export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1 ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so) if [ -f "$HERE/libc++_shared.so" ]; then # Workaround for https://github.com/android-ndk/ndk/issues/988. export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so" else export LD_PRELOAD="$ASAN_LIB" fi "$@"
ধরে নিন আপনার প্রজেক্টের অ্যাপ্লিকেশন মডিউলটির নাম app , তাহলে আপনার চূড়ান্ত ডিরেক্টরি কাঠামোতে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকবে:
<project root>
└── app
└── src
└── main
├── jniLibs
│ ├── arm64-v8a
│ │ └── libclang_rt.asan-aarch64-android.so
│ ├── armeabi-v7a
│ │ └── libclang_rt.asan-arm-android.so
│ ├── x86
│ │ └── libclang_rt.asan-i686-android.so
│ └── x86_64
│ └── libclang_rt.asan-x86_64-android.so
└── resources
└── lib
├── arm64-v8a
│ └── wrap.sh
├── armeabi-v7a
│ └── wrap.sh
├── x86
│ └── wrap.sh
└── x86_64
└── wrap.sh
স্ট্যাক ট্রেস
প্রতিটি malloc / realloc / free কলের সময় Address Sanitizer-কে স্ট্যাক আনওয়াইন্ড করতে হয়। এক্ষেত্রে দুটি বিকল্প রয়েছে:
একটি "দ্রুত" ফ্রেম পয়েন্টার-ভিত্তিক আনওয়াইন্ডার। বিল্ডিং বিভাগে দেওয়া নির্দেশাবলী অনুসরণ করে এটিই ব্যবহার করা হয়।
একটি "ধীরগতির" CFI আনওয়াইন্ডার। এই মোডে ASan
_Unwind_Backtraceব্যবহার করে। এর জন্য শুধুমাত্র-funwind-tablesপ্রয়োজন, যা সাধারণত ডিফল্টরূপে সক্রিয় থাকে।
malloc/realloc/free-এর জন্য ফাস্ট আনওয়াইন্ডার হলো ডিফল্ট। ফ্যাটাল স্ট্যাক ট্রেসের জন্য স্লো আনওয়াইন্ডার হলো ডিফল্ট। আপনার wrap.sh-এ থাকা ASAN_OPTIONS ভেরিয়েবলে fast_unwind_on_malloc=0 যোগ করে সমস্ত স্ট্যাক ট্রেসের জন্য স্লো আনওয়াইন্ডার সক্রিয় করা যেতে পারে।