UndefinedBehaviorSanitizer (UBSan) বিভিন্ন ধরণের অনির্ধারিত আচরণ পরীক্ষা করার জন্য কম্পাইল-টাইম ইন্সট্রুমেন্টেশন সম্পাদন করে। যদিও UBSan অনেক অনির্ধারিত আচরণ বাগ সনাক্ত করতে সক্ষম, Android সমর্থন করে:
- সারিবদ্ধকরণ
- বুল
- সীমানা
- এনাম
- ভাসমান-ঢালাই-ওভারফ্লো
- শূন্য দিয়ে ভাসমান ভাগ
- পূর্ণসংখ্যা-শূন্য-দ্বারা-ভাগ
- নন-নাল-অ্যাট্রিবিউট
- শূন্য
- প্রত্যাবর্তন
- নননাল-অ্যাট্রিবিউট ফেরত দেয়
- শিফট-বেস
- স্থানান্তর-ঘোষক
- সাইনড-ইন্টিজার-ওভারফ্লো
- অগম্য
- স্বাক্ষরবিহীন-পূর্ণসংখ্যা-ওভারফ্লো
- ভিএলএ-বাউন্ড
unsigned-integer-overflow, যদিও টেকনিক্যালি অনির্ধারিত আচরণ নয়, স্যানিটাইজারে অন্তর্ভুক্ত করা হয়েছে এবং মিডিয়াসার্ভার উপাদান সহ অনেক অ্যান্ড্রয়েড মডিউলে ব্যবহৃত হয়, যাতে যেকোনো সুপ্ত পূর্ণসংখ্যা-ওভারফ্লো দুর্বলতা দূর করা যায়।
বাস্তবায়ন
অ্যান্ড্রয়েড বিল্ড সিস্টেমে, আপনি বিশ্বব্যাপী বা স্থানীয়ভাবে 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 শর্টকাট
অ্যান্ড্রয়েডে দুটি শর্টকাট আছে, integer এবং default-ub , যা একই সাথে স্যানিটাইজারের একটি সেট সক্ষম করে। integer 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 । integer sanitizer ক্লাসটি SANITIZE_TARGET এবং LOCAL_SANITIZE এর সাথে ব্যবহার করা যেতে পারে, যেখানে default-ub শুধুমাত্র SANITIZE_TARGET এর সাথে ব্যবহার করা যেতে পারে।
আরও ভালো ত্রুটি প্রতিবেদন
অনির্ধারিত আচরণের সম্মুখীন হলে অ্যান্ড্রয়েডের ডিফল্ট UBSan বাস্তবায়ন একটি নির্দিষ্ট ফাংশন চালু করে। ডিফল্টরূপে, এই ফাংশনটি বাতিল করা হয়। যাইহোক, অক্টোবর ২০১৬ থেকে, অ্যান্ড্রয়েডে 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')
পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন
অনিচ্ছাকৃত পূর্ণসংখ্যা ওভারফ্লো মেমোরি অ্যাক্সেস বা মেমোরি বরাদ্দের সাথে সম্পর্কিত ভেরিয়েবলগুলিতে মেমোরি দুর্নীতি বা তথ্য প্রকাশের দুর্বলতা সৃষ্টি করতে পারে। এটি মোকাবেলা করার জন্য, আমরা অ্যান্ড্রয়েড 7.0-এ মিডিয়া ফ্রেমওয়ার্ককে আরও শক্ত করার জন্য ক্ল্যাং-এর আনডিফাইন্ডবিহেভিয়ারস্যানিটাইজার (UBSan) স্বাক্ষরিত এবং আনসাইনড ইন্টিজার ওভারফ্লো স্যানিটাইজার যুক্ত করেছি। অ্যান্ড্রয়েড 9-এ, আমরা আরও উপাদান কভার করার জন্য UBSan প্রসারিত করেছি এবং এর জন্য উন্নত বিল্ড সিস্টেম সমর্থন করেছি।
এটি গাণিতিক ক্রিয়াকলাপ / নির্দেশাবলীর চারপাশে চেক যুক্ত করার জন্য ডিজাইন করা হয়েছে - যা ওভারফ্লো হতে পারে - যাতে ওভারফ্লো ঘটলে কোনও প্রক্রিয়া নিরাপদে বাতিল করা যায়। এই স্যানিটাইজারগুলি মেমরি দুর্নীতি এবং তথ্য প্রকাশের দুর্বলতার একটি সম্পূর্ণ শ্রেণীকে হ্রাস করতে পারে যেখানে মূল কারণ একটি পূর্ণসংখ্যা ওভারফ্লো, যেমন মূল স্টেজফ্রাইট দুর্বলতা।
উদাহরণ এবং উৎস
ইন্টিজার ওভারফ্লো স্যানিটাইজেশন (IntSan) কম্পাইলার দ্বারা সরবরাহ করা হয় এবং গাণিতিক ওভারফ্লো সনাক্ত করার জন্য কম্পাইলের সময় বাইনারিতে যন্ত্রাংশ যোগ করে। এটি প্ল্যাটফর্ম জুড়ে বিভিন্ন উপাদানে ডিফল্টরূপে সক্রিয় থাকে, উদাহরণস্বরূপ /platform/external/libnl/Android.bp ।
বাস্তবায়ন
IntSan UBSan এর স্বাক্ষরিত এবং স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজার ব্যবহার করে। এই প্রশমনটি প্রতি-মডিউল স্তরে সক্ষম। এটি অ্যান্ড্রয়েডের গুরুত্বপূর্ণ উপাদানগুলিকে সুরক্ষিত রাখতে সাহায্য করে এবং এটি অক্ষম করা উচিত নয়।
আমরা আপনাকে অতিরিক্ত উপাদানের জন্য ইন্টিজার ওভারফ্লো স্যানিটাইজেশন সক্ষম করার জন্য জোরালোভাবে উৎসাহিত করছি। আদর্শ প্রার্থীরা হলেন বিশেষাধিকারপ্রাপ্ত নেটিভ কোড বা নেটিভ কোড যা অবিশ্বস্ত ব্যবহারকারীর ইনপুট পার্স করে। স্যানিটাইজারের সাথে একটি ছোট পারফরম্যান্স ওভারহেড যুক্ত থাকে যা কোডের ব্যবহার এবং গাণিতিক ক্রিয়াকলাপের প্রসারের উপর নির্ভর করে। একটি ছোট ওভারহেড শতাংশ আশা করুন এবং পারফরম্যান্স একটি উদ্বেগের বিষয় কিনা তা পরীক্ষা করুন।
মেকফাইলে IntSan সমর্থন করুন
একটি মেকফাইলে IntSan সক্রিয় করতে, যোগ করুন:
LOCAL_SANITIZE := integer_overflow # Optional features LOCAL_SANITIZE_DIAG := integer_overflow LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
-
LOCAL_SANITIZEস্যানিটাইজারগুলির একটি কমা দ্বারা পৃথক তালিকা নেয়, যেখানেinteger_overflowহল একটি পূর্ব-প্যাকেজ করা বিকল্পগুলির একটি সেট যা একটি ডিফল্ট BLOCKLIST সহ পৃথক স্বাক্ষরিত এবং স্বাক্ষরিত পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারের জন্য। -
LOCAL_SANITIZE_DIAGস্যানিটাইজারের জন্য ডায়াগনস্টিক মোড চালু করে। শুধুমাত্র পরীক্ষার সময় ডায়াগনস্টিক মোড ব্যবহার করুন কারণ এটি ওভারফ্লো বন্ধ করবে না, যা প্রশমনের নিরাপত্তা সুবিধাকে সম্পূর্ণরূপে বাতিল করবে। অতিরিক্ত তথ্যের জন্য সমস্যা সমাধান দেখুন। -
LOCAL_SANITIZE_BLOCKLISTআপনাকে ফাংশন এবং সোর্স ফাইলগুলিকে স্যানিটাইজ করা থেকে বিরত রাখতে একটি 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 প্রোপার্টি হল একটি পূর্ব-প্যাকেজ করা বিকল্পের সেট যা স্বতন্ত্র স্বাক্ষরিত এবং স্বাক্ষরিত নয় এমন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারের জন্য একটি ডিফল্ট BLOCKLIST সহ।
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",
},সমস্যা সমাধান
যদি আপনি নতুন কম্পোনেন্টগুলিতে ইন্টিজার ওভারফ্লো স্যানিটাইজেশন সক্ষম করেন, অথবা ইন্টিজার ওভারফ্লো স্যানিটাইজেশন সম্পন্ন প্ল্যাটফর্ম লাইব্রেরির উপর নির্ভর করেন, তাহলে আপনি বিনাইন ইন্টিজার ওভারফ্লো সহ কিছু সমস্যার সম্মুখীন হতে পারেন যার ফলে অ্যাবর্ট হতে পারে। বিনাইন ওভারফ্লোগুলি দেখা দিতে পারে তা নিশ্চিত করার জন্য আপনার স্যানিটাইজেশন সক্ষম করে কম্পোনেন্টগুলি পরীক্ষা করা উচিত।
ব্যবহারকারীর বিল্ডগুলিতে স্যানিটাইজেশনের কারণে অ্যাবর্ট হওয়া খুঁজে পেতে, UBSan দ্বারা ধরা পড়া ওভারফ্লো নির্দেশ করে এমন Abort বার্তা সহ SIGABRT ক্র্যাশগুলি অনুসন্ধান করুন, যেমন:
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')
সমস্যাযুক্ত গাণিতিক ক্রিয়াকলাপটি সনাক্ত হয়ে গেলে, নিশ্চিত করুন যে ওভারফ্লোটি সৌম্য এবং উদ্দেশ্যপ্রণোদিত (যেমন কোনও সুরক্ষা প্রভাব নেই)। আপনি স্যানিটাইজার বাতিলের সমাধান করতে পারেন:
- ওভারফ্লো এড়াতে কোডটি রিফ্যাক্টর করা ( উদাহরণস্বরূপ )
- ক্ল্যাং এর __builtin_*_overflow ফাংশনের মাধ্যমে স্পষ্টভাবে ওভারফ্লো করা ( উদাহরণস্বরূপ )
-
no_sanitizeঅ্যাট্রিবিউট নির্দিষ্ট করে ফাংশনে স্যানিটাইজেশন অক্ষম করা ( উদাহরণস্বরূপ ) - একটি ব্লকলিস্ট ফাইলের মাধ্যমে একটি ফাংশন বা সোর্স ফাইলের স্যানিটাইজেশন অক্ষম করা ( উদাহরণস্বরূপ )
আপনার যতটা সম্ভব দানাদার সমাধান ব্যবহার করা উচিত। উদাহরণস্বরূপ, অনেক গাণিতিক ক্রিয়াকলাপ এবং একটি একক ওভারফ্লোয়িং অপারেশন সহ একটি বৃহৎ ফাংশনে সম্পূর্ণ ফাংশনটি ব্লকলিস্ট করার পরিবর্তে একক অপারেশনটি পুনঃফ্যাক্টর করা উচিত।
সাধারণ প্যাটার্নগুলির ফলে সৌম্য ওভারফ্লো হতে পারে:
- অন্তর্নিহিত কাস্ট যেখানে স্বাক্ষরিত প্রকারে কাস্ট করার আগে একটি স্বাক্ষরবিহীন ওভারফ্লো ঘটে ( উদাহরণস্বরূপ )
- লিঙ্কযুক্ত তালিকা মুছে ফেলা যা মুছে ফেলার সময় লুপ সূচক হ্রাস করে ( উদাহরণস্বরূপ )
- প্রকৃত সর্বোচ্চ মান নির্দিষ্ট করার পরিবর্তে -1 তে একটি স্বাক্ষরবিহীন প্রকার নির্ধারণ করা ( উদাহরণস্বরূপ )
- লুপ যা শর্তে একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা হ্রাস করে ( উদাহরণ , উদাহরণ )
স্যানিটাইজেশন বন্ধ করার আগে, ডেভেলপারদের নিশ্চিত করতে হবে যে স্যানিটাইজারটি অতিরিক্ত পরিমাণে পানি শনাক্ত করে যে এটি আসলেই কোনও অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া বা নিরাপত্তাগত প্রভাব ছাড়াই তৈরি।
IntSan অক্ষম করুন
আপনি ব্লকলিস্ট বা ফাংশন অ্যাট্রিবিউট ব্যবহার করে IntSan অক্ষম করতে পারেন। কোড রিফ্যাক্টরিং অযৌক্তিক হলে অথবা পারফরম্যান্স ওভারহেডের সমস্যা থাকলে, অল্প পরিমাণে এবং শুধুমাত্র তখনই অক্ষম করুন।
ফাংশন অ্যাট্রিবিউট এবং BLOCKLIST ফাইল ফর্ম্যাটিং সহ IntSan নিষ্ক্রিয় করার বিষয়ে আরও তথ্যের জন্য আপস্ট্রিম ক্ল্যাং ডকুমেন্টেশন দেখুন। অন্যান্য স্যানিটাইজারের উপর প্রভাব এড়াতে লক্ষ্য স্যানিটাইজার নির্দিষ্ট করে এমন বিভাগের নাম ব্যবহার করে ব্লকলিস্টিং নির্দিষ্ট স্যানিটাইজারের মধ্যে সীমাবদ্ধ করা উচিত।
বৈধতা
বর্তমানে, ইন্টিজার ওভারফ্লো স্যানিটাইজেশনের জন্য বিশেষভাবে কোনও CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে CTS পরীক্ষাগুলি IntSan সক্ষম থাকা অবস্থায় বা ছাড়াই পাস হয়েছে যাতে এটি ডিভাইসের উপর প্রভাব ফেলছে না তা যাচাই করা যায়।
সীমানা স্যানিটাইজেশন
BoundsSanitizer (BoundSan) অ্যারে অ্যাক্সেসের চারপাশে বাউন্ড চেক সন্নিবেশ করার জন্য বাইনারিগুলিতে যন্ত্র যোগ করে। এই চেকগুলি যোগ করা হয় যদি কম্পাইলার কম্পাইলের সময় প্রমাণ করতে না পারে যে অ্যাক্সেস নিরাপদ হবে এবং রানটাইমের সময় অ্যারের আকার জানা যাবে কিনা, যাতে এটি পরীক্ষা করা যায়। Android 10 ব্লুটুথ এবং কোডেকে BoundSan স্থাপন করে। BoundSan কম্পাইলার দ্বারা সরবরাহ করা হয় এবং প্ল্যাটফর্ম জুড়ে বিভিন্ন উপাদানে ডিফল্টরূপে সক্রিয় থাকে।
বাস্তবায়ন
BoundSan UBSan এর bounds স্যানিটাইজার ব্যবহার করে। এই প্রশমনটি প্রতি-মডিউল স্তরে সক্ষম। এটি অ্যান্ড্রয়েডের গুরুত্বপূর্ণ উপাদানগুলিকে সুরক্ষিত রাখতে সাহায্য করে এবং এটি অক্ষম করা উচিত নয়।
আমরা আপনাকে অতিরিক্ত উপাদানের জন্য BoundSan সক্ষম করার জন্য দৃঢ়ভাবে উৎসাহিত করছি। আদর্শ প্রার্থীরা হলেন বিশেষাধিকারপ্রাপ্ত নেটিভ কোড অথবা জটিল নেটিভ কোড যা অবিশ্বস্ত ব্যবহারকারীর ইনপুট বিশ্লেষণ করে। BoundSan সক্ষম করার সাথে সম্পর্কিত পারফরম্যান্স ওভারহেড নির্ভর করে কতগুলি অ্যারে অ্যাক্সেস নিরাপদ প্রমাণিত হতে পারে তার উপর। গড়ে একটি ছোট ওভারহেড শতাংশ আশা করুন এবং পারফরম্যান্স একটি উদ্বেগের বিষয় কিনা তা পরীক্ষা করুন।
ব্লুপ্রিন্ট ফাইলগুলিতে বাউন্ডসান সক্ষম করুন
বাইনারি এবং লাইব্রেরি মডিউলের জন্য misc_undefined sanitize প্রপার্টিতে "bounds" যোগ করে ব্লুপ্রিন্ট ফাইলগুলিতে BoundSan সক্রিয় করা যেতে পারে:
sanitize: {
misc_undefined: ["bounds"],
diag: {
misc_undefined: ["bounds"],
},
BLOCKLIST: "modulename_BLOCKLIST.txt",ডায়াগ
diag প্রপার্টি স্যানিটাইজারের জন্য ডায়াগনস্টিক মোড সক্ষম করে। শুধুমাত্র পরীক্ষার সময় ডায়াগনস্টিক মোড ব্যবহার করুন। ডায়াগনস্টিক মোড ওভারফ্লো বন্ধ করে না, যা প্রশমনের নিরাপত্তা সুবিধাকে অস্বীকার করে এবং উচ্চতর কর্মক্ষমতা ওভারহেড বহন করে, তাই এটি উৎপাদন বিল্ডের জন্য সুপারিশ করা হয় না।
ব্লকলিস্ট
BLOCKLIST প্রপার্টিটি একটি BLOCKLIST ফাইলের স্পেসিফিকেশনের অনুমতি দেয় যা ডেভেলপাররা ফাংশন এবং সোর্স ফাইলগুলিকে স্যানিটাইজ করা থেকে বিরত রাখতে ব্যবহার করতে পারে। এই প্রপার্টিটি শুধুমাত্র তখনই ব্যবহার করুন যদি পারফরম্যান্স একটি উদ্বেগের বিষয় হয় এবং লক্ষ্যযুক্ত ফাইল/ফাংশনগুলি উল্লেখযোগ্যভাবে অবদান রাখে। অ্যারে অ্যাক্সেসগুলি নিরাপদ কিনা তা নিশ্চিত করতে এই ফাইল/ফাংশনগুলি ম্যানুয়ালি অডিট করুন। অতিরিক্ত তথ্যের জন্য সমস্যা সমাধান দেখুন।
মেকফাইলে বাউন্ডসান সক্ষম করুন
বাইনারি এবং লাইব্রেরি মডিউলের জন্য LOCAL_SANITIZE ভেরিয়েবলে "bounds" যোগ করে মেকফাইলে BoundSan সক্রিয় করা যেতে পারে:
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 অক্ষম করতে পারেন। BoundSan সক্ষম রাখাই ভাল, তাই শুধুমাত্র তখনই এটি অক্ষম করুন যদি ফাংশন বা ফাইলটি প্রচুর পরিমাণে পারফরম্যান্স ওভারহেড তৈরি করে এবং সোর্সটি ম্যানুয়ালি পর্যালোচনা করা হয়।
ফাংশন অ্যাট্রিবিউট এবং BLOCKLIST ফাইল ফর্ম্যাটিং সহ BoundSan নিষ্ক্রিয় করার বিষয়ে আরও তথ্যের জন্য, Clang LLVM ডকুমেন্টেশন দেখুন। অন্যান্য স্যানিটাইজারের উপর প্রভাব এড়াতে লক্ষ্য স্যানিটাইজার নির্দিষ্ট করে এমন বিভাগের নাম ব্যবহার করে BLOCKLISTing কে নির্দিষ্ট স্যানিটাইজারে অন্তর্ভুক্ত করুন।
বৈধতা
BoundSan-এর জন্য বিশেষভাবে কোনও CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে BoundSan সক্ষম থাকা অবস্থায় বা ছাড়াই CTS পরীক্ষাগুলি পাস হয়েছে যাতে এটি ডিভাইসের উপর প্রভাব ফেলছে না তা যাচাই করা যায়।
সমস্যা সমাধান
বাউন্ডসান সক্ষম করার পরে উপাদানগুলি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন যাতে নিশ্চিত করা যায় যে পূর্বে সনাক্ত না করা আউট-অফ-বাউন্ড অ্যাক্সেসগুলি সমাধান করা হয়েছে।
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]'