অনির্ধারিত আচরণ স্যানিটাইজার

Undefined BehaviorSanitizer (UBSan) বিভিন্ন ধরনের অনির্ধারিত আচরণ পরীক্ষা করার জন্য কম্পাইল-টাইম ইন্সট্রুমেন্টেশন করে। যদিও UBSan অনেক অনির্ধারিত আচরণের বাগ সনাক্ত করতে সক্ষম, Android সমর্থন করে:

  • প্রান্তিককরণ
  • bool
  • সীমানা
  • enum
  • float-cast-overflow
  • শূন্য দ্বারা ভাসা
  • পূর্ণসংখ্যা-বিভাজ্য-শূন্য
  • nonnull-অ্যাট্রিবিউট
  • নাল
  • ফিরে
  • রিটার্ন-অনুল-অ্যাট্রিবিউট
  • শিফট-বেস
  • shift-exponent
  • স্বাক্ষরিত-পূর্ণসংখ্যা-ওভারফ্লো
  • অগম্য
  • স্বাক্ষরবিহীন-পূর্ণসংখ্যা-ওভারফ্লো
  • vla- আবদ্ধ

স্বাক্ষরবিহীন-পূর্ণসংখ্যা-ওভারফ্লো, যদিও প্রযুক্তিগতভাবে অনির্ধারিত আচরণ নয়, এটি স্যানিটাইজারে অন্তর্ভুক্ত করা হয়েছে এবং মিডিয়াসার্ভার উপাদান সহ অনেকগুলি অ্যান্ড্রয়েড মডিউলে ব্যবহার করা হয়েছে, কোনো সুপ্ত পূর্ণসংখ্যা-ওভারফ্লো দুর্বলতা দূর করতে।

বাস্তবায়ন

অ্যান্ড্রয়েড বিল্ড সিস্টেমে, আপনি বিশ্বব্যাপী বা স্থানীয়ভাবে 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-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 পূর্ণসংখ্যা স্যানিটাইজার ক্লাসটি SANITIZE_TARGET এবং LOCAL_SANITIZE এর সাথে ব্যবহার করা যেতে পারে, যখন ডিফল্ট-ub শুধুমাত্র SANITIZE_TARGET এর সাথে ব্যবহার করা যেতে পারে।

ভাল ত্রুটি রিপোর্টিং

অ্যান্ড্রয়েডের ডিফল্ট UBSan বাস্তবায়ন একটি নির্দিষ্ট ফাংশন আহ্বান করে যখন অনির্ধারিত আচরণের সম্মুখীন হয়। ডিফল্টরূপে, এই ফাংশনটি বাতিল করা হয়। যাইহোক, অক্টোবর 2016 থেকে শুরু করে, অ্যান্ড্রয়েড-এ 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')

পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন

অনিচ্ছাকৃত পূর্ণসংখ্যা ওভারফ্লো মেমরি অ্যাক্সেস বা মেমরি বরাদ্দের সাথে যুক্ত ভেরিয়েবলে মেমরি দুর্নীতি বা তথ্য প্রকাশের দুর্বলতা সৃষ্টি করতে পারে। এটি মোকাবেলা করার জন্য, আমরা Android 7.0-এ মিডিয়া ফ্রেমওয়ার্ককে শক্ত করার জন্য Clang-এর Undefined Behavior Sanitizer (UBSan) স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজার যুক্ত করেছি। অ্যান্ড্রয়েড 9-এ, আমরা আরও উপাদান কভার করতে UBSan প্রসারিত করেছি এবং এটির জন্য উন্নত বিল্ড সিস্টেম সমর্থন করেছি।

এটি গাণিতিক ক্রিয়াকলাপ / নির্দেশাবলীর চারপাশে চেক যুক্ত করার জন্য ডিজাইন করা হয়েছে - যা ওভারফ্লো হতে পারে - একটি ওভারফ্লো ঘটলে নিরাপদে একটি প্রক্রিয়া বাতিল করতে৷ এই স্যানিটাইজারগুলি মেমরি দুর্নীতি এবং তথ্য প্রকাশের দুর্বলতাগুলির একটি সম্পূর্ণ শ্রেণিকে প্রশমিত করতে পারে যেখানে মূল কারণটি একটি পূর্ণসংখ্যা ওভারফ্লো, যেমন মূল স্টেজফ্রাইট দুর্বলতা।

উদাহরণ এবং উৎস

পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন (IntSan) কম্পাইলার দ্বারা সরবরাহ করা হয় এবং গাণিতিক ওভারফ্লো সনাক্ত করতে কম্পাইলের সময় বাইনারিতে উপকরণ যোগ করে। এটি প্ল্যাটফর্ম জুড়ে বিভিন্ন উপাদানে ডিফল্টরূপে সক্রিয় থাকে, উদাহরণস্বরূপ /platform/external/libnl/Android.bp

বাস্তবায়ন

IntSan UBSan-এর স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজার ব্যবহার করে। প্রতি-মডিউল স্তরে এই প্রশমন সক্রিয় করা হয়েছে। এটি Android এর গুরুত্বপূর্ণ উপাদানগুলিকে সুরক্ষিত রাখতে সাহায্য করে এবং অক্ষম করা উচিত নয়৷

আমরা দৃঢ়ভাবে আপনাকে অতিরিক্ত উপাদানগুলির জন্য পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজেশন সক্ষম করতে উত্সাহিত করি। আদর্শ প্রার্থীরা বিশেষাধিকারপ্রাপ্ত নেটিভ কোড বা নেটিভ কোড যা অবিশ্বস্ত ব্যবহারকারীর ইনপুট পার্স করে। স্যানিটাইজারের সাথে যুক্ত একটি ছোট পারফরম্যান্স ওভারহেড রয়েছে যা কোডের ব্যবহার এবং গাণিতিক ক্রিয়াকলাপের ব্যাপকতার উপর নির্ভরশীল। একটি ছোট ওভারহেড শতাংশ আশা করুন এবং কর্মক্ষমতা একটি উদ্বেগ যদি পরীক্ষা.

মেকফাইলে IntSan সমর্থন করুন

একটি মেকফাইলে IntSan সক্ষম করতে, যোগ করুন:

LOCAL_SANITIZE := integer_overflow
    # Optional features
    LOCAL_SANITIZE_DIAG := integer_overflow
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
  • LOCAL_SANITIZE স্যানিটাইজারগুলির একটি কমা বিভক্ত তালিকা নেয়, integer_overflow হল একটি ডিফল্ট ব্লকলিস্ট সহ স্বতন্ত্র স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারগুলির জন্য একটি প্রাক-প্যাকেজ করা বিকল্প।
  • 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 প্রপার্টি হল একটি ডিফল্ট ব্লকলিস্ট সহ স্বতন্ত্র স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যা ওভারফ্লো স্যানিটাইজারগুলির জন্য একটি প্রাক-প্যাকেজ করা বিকল্প।

বৈশিষ্ট্যের diag সেট স্যানিটাইজারগুলির জন্য ডায়াগনস্টিক মোড সক্ষম করে। শুধুমাত্র পরীক্ষার সময় ডায়াগনস্টিক মোড ব্যবহার করুন। ডায়াগনস্টিক মোড ওভারফ্লোতে বাতিল হয় না, যা ব্যবহারকারীর বিল্ডে প্রশমনের নিরাপত্তা সুবিধাকে সম্পূর্ণভাবে অস্বীকার করে। অতিরিক্ত বিবরণের জন্য সমস্যা সমাধান দেখুন।

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 অক্ষম করুন

আপনি BLOCKLISTs বা ফাংশন বৈশিষ্ট্য সহ IntSan অক্ষম করতে পারেন৷ অল্প পরিমাণে অক্ষম করুন এবং শুধুমাত্র যখন কোড রিফ্যাক্টর করা অন্যথায় অযৌক্তিক হয় বা যদি সমস্যাযুক্ত কর্মক্ষমতা ওভারহেড থাকে।

ফাংশন বৈশিষ্ট্য এবং BLOCKLIST ফাইল বিন্যাস সহ IntSan নিষ্ক্রিয় করার বিষয়ে আরও তথ্যের জন্য আপস্ট্রিম ক্ল্যাং ডকুমেন্টেশন দেখুন। অন্যান্য স্যানিটাইজারকে প্রভাবিত না করার জন্য লক্ষ্য স্যানিটাইজার নির্দিষ্ট করে সেকশনের নাম ব্যবহার করে ব্লকলিস্টিং নির্দিষ্ট স্যানিটাইজারের জন্য স্কোপ করা উচিত।

বৈধতা

বর্তমানে, ইন্টিজার ওভারফ্লো স্যানিটাইজেশনের জন্য বিশেষভাবে কোনো CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে এটি ডিভাইসে প্রভাব ফেলছে না তা যাচাই করার জন্য CTS পরীক্ষাগুলি IntSan সক্ষম সহ বা ছাড়াই পাস করেছে।

সীমাবদ্ধ স্যানিটাইজেশন

বাউন্ডস্যানিটাইজার (বাউন্ডসান) অ্যারে অ্যাক্সেসের চারপাশে বাউন্ড চেক সন্নিবেশ করার জন্য বাইনারিগুলিতে উপকরণ যোগ করে। এই চেকগুলি যোগ করা হয় যদি কম্পাইলার কম্পাইলের সময় প্রমাণ করতে না পারে যে অ্যাক্সেস নিরাপদ হবে এবং অ্যারের আকার রানটাইমে জানা যাবে, যাতে এটির বিরুদ্ধে পরীক্ষা করা যায়। Android 10 ব্লুটুথ এবং কোডেকগুলিতে বাউন্ডসান স্থাপন করে। BoundSan কম্পাইলার দ্বারা প্রদান করা হয় এবং প্ল্যাটফর্ম জুড়ে বিভিন্ন উপাদানে ডিফল্টরূপে সক্রিয় করা হয়।

বাস্তবায়ন

BoundSan UBSan এর বাউন্ডস স্যানিটাইজার ব্যবহার করে। প্রতি-মডিউল স্তরে এই প্রশমন সক্রিয় করা হয়েছে। এটি Android এর গুরুত্বপূর্ণ উপাদানগুলিকে সুরক্ষিত রাখতে সাহায্য করে এবং অক্ষম করা উচিত নয়৷

আমরা দৃঢ়ভাবে আপনাকে অতিরিক্ত উপাদানগুলির জন্য BoundSan সক্ষম করতে উত্সাহিত করি। আদর্শ প্রার্থীরা বিশেষ সুবিধাপ্রাপ্ত নেটিভ কোড বা জটিল নেটিভ কোড যা অবিশ্বস্ত ব্যবহারকারীর ইনপুট পার্স করে। BoundSan সক্ষম করার সাথে যুক্ত কর্মক্ষমতা ওভারহেড অ্যারে অ্যাক্সেসের সংখ্যার উপর নির্ভর করে যা নিরাপদ প্রমাণিত হতে পারে না। গড় একটি ছোট ওভারহেড শতাংশ আশা করুন এবং কর্মক্ষমতা একটি উদ্বেগ যদি পরীক্ষা.

ব্লুপ্রিন্ট ফাইলগুলিতে BoundSan সক্ষম করুন

বাইনারি এবং লাইব্রেরি মডিউলগুলির জন্য misc_undefined sanitize সম্পত্তিতে "bounds" যোগ করে BoundSan ব্লুপ্রিন্ট ফাইলগুলিতে সক্রিয় করা যেতে পারে:

    sanitize: {
       misc_undefined: ["bounds"],
       diag: {
          misc_undefined: ["bounds"],
       },
       BLOCKLIST: "modulename_BLOCKLIST.txt",
diag

diag সম্পত্তি স্যানিটাইজারগুলির জন্য ডায়াগনস্টিক মোড সক্ষম করে। শুধুমাত্র পরীক্ষার সময় ডায়াগনস্টিক মোড ব্যবহার করুন। ডায়াগনস্টিক মোড ওভারফ্লোতে বাতিল হয় না, যা প্রশমনের নিরাপত্তা সুবিধাকে অস্বীকার করে এবং একটি উচ্চ কার্যক্ষমতা ওভারহেড বহন করে, তাই এটি উত্পাদন বিল্ডের জন্য সুপারিশ করা হয় না।

ব্লকলিস্ট

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 ফাইলের স্পেসিফিকেশনের অনুমতি দেয় যা ডেভেলপারদের ফাংশন এবং সোর্স ফাইলগুলিকে স্যানিটাইজ করা থেকে আটকাতে দেয়। এই বৈশিষ্ট্যটি ব্যবহার করুন শুধুমাত্র যদি কর্মক্ষমতা একটি উদ্বেগ এবং লক্ষ্যযুক্ত ফাইল/ফাংশন যথেষ্ট অবদান রাখে। অ্যারে অ্যাক্সেস নিরাপদ কিনা তা নিশ্চিত করতে এই ফাইল/ফাংশনগুলি ম্যানুয়ালি অডিট করুন। অতিরিক্ত বিবরণের জন্য সমস্যা সমাধান দেখুন।

বাউন্ডসান অক্ষম করুন

আপনি BLOCKLIST বা ফাংশন বৈশিষ্ট্য সহ ফাংশন এবং উত্স ফাইলগুলিতে BoundSan অক্ষম করতে পারেন৷ BoundSan সক্রিয় রাখা ভাল, তাই শুধুমাত্র যদি ফাংশন বা ফাইলটি প্রচুর পরিমাণে কর্মক্ষমতা ওভারহেড তৈরি করে এবং উত্সটি ম্যানুয়ালি পর্যালোচনা করা হয় তবেই এটি অক্ষম করুন৷

ফাংশন বৈশিষ্ট্য এবং BLOCKLIST ফাইল বিন্যাস সহ BoundSan নিষ্ক্রিয় করার বিষয়ে আরও তথ্যের জন্য, Clang LLVM ডকুমেন্টেশন পড়ুন। অন্যান্য স্যানিটাইজারগুলিকে প্রভাবিত না করার জন্য লক্ষ্য স্যানিটাইজার নির্দিষ্ট করে সেকশনের নাম ব্যবহার করে নির্দিষ্ট স্যানিটাইজারে ব্লকলিস্টিং স্কোপ করুন।

বৈধতা

BoundSan-এর জন্য বিশেষভাবে কোনো CTS পরীক্ষা নেই। পরিবর্তে, নিশ্চিত করুন যে এটি ডিভাইসটিকে প্রভাবিত করছে না তা যাচাই করতে CTS পরীক্ষাগুলি BoundSan সক্ষম সহ বা ছাড়া পাস করেছে৷

সমস্যা সমাধান

BoundSan সক্ষম করার পরে উপাদানগুলিকে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন যাতে নিশ্চিত করা যায় যে কোনো পূর্বে সনাক্ত করা হয়নি এমন বাউন্ড-অফ-বাউন্ড অ্যাক্সেসের সমাধান করা হয়েছে।

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]'