اشکال زدایی و کاهش خطای حافظه

اندروید از چندین ابزار برای رفع اشکال خطاهای حافظه پشتیبانی می کند. برای هرکدام معاوضه هایی وجود دارد، بنابراین برای تصمیم گیری در مورد بهترین مورد برای استفاده شما، زیر را بخوانید. این سند به شما یک نمای کلی از ابزارهای موجود می دهد تا بتوانید تصمیم بگیرید که کدامیک را بیشتر بررسی کنید، اما هدف آن مختصر است، بنابراین برای جزئیات، اسناد مخصوص ابزار را بخوانید.

tl;dr

  • برای غیرممکن کردن خطاهای حافظه تا حد امکان از یک زبان امن برای حافظه استفاده کنید
  • همیشه از PAC/BTI برای کاهش حملات ROP/JOP استفاده کنید
  • همیشه از GWP-ASan برای تشخیص خطاهای حافظه نادر در تولید استفاده کنید
  • از HWASan برای تشخیص خطاهای حافظه در طول آزمایش استفاده کنید
  • دستگاه‌های دارای قابلیت MTE معمولاً در سال 2023 در دسترس نیستند، اما اگر قادر به تشخیص خطا در تولید هستید، از آن استفاده کنید.
  • از ASan در طول آزمایش فقط به عنوان آخرین راه حل استفاده کنید

زبان های ایمن حافظه

زبان امن حافظه تنها راه برای جلوگیری و کاهش خطاهای حافظه است. سایر ابزارهای موجود در این صفحه می‌توانند به شما کمک کنند تا کد ناامن حافظه خود را ایمن‌تر و قابل اعتمادتر کنید، اما استفاده از یک زبان ایمن حافظه کل مشکلات را برطرف می‌کند.

زبان‌های ایمن حافظه رسمی پشتیبانی شده برای اندروید جاوا و کاتلین هستند. توسعه اکثر برنامه های اندروید به یکی از آن زبان ها آسان تر است.

با این اوصاف، کدهای ارسال برنامه‌نویسان برنامه وجود دارد که به زبان Rust نوشته شده‌اند، و اگر در حال خواندن این صفحه هستید، احتمالاً دلیل خوبی برای نیاز به کد بومی (قابل حمل، عملکرد یا هر دو) دارید. Rust بهترین انتخاب برای کد بومی ایمن حافظه در اندروید است. تیم NDK لزوماً نمی تواند به شما در رفع مشکلاتی که در صورت رفتن به آن مسیر با آن مواجه می شوید کمک کند، اما ما علاقه مندیم در مورد آنها بشنویم !

PAC/BTI

احراز هویت اشاره‌گر و شناسایی هدف شاخه ، که با نام PAC/BTI نیز شناخته می‌شود، ابزارهای کاهشی مناسب برای استفاده در تولید هستند. اگرچه فناوری‌های مجزا هستند، اما توسط یک پرچم کامپایلر کنترل می‌شوند، بنابراین همیشه با هم استفاده می‌شوند.

این ویژگی‌ها با دستگاه‌هایی که از آن‌ها پشتیبانی نمی‌کنند سازگار هستند، زیرا دستورالعمل‌های جدید مورد استفاده در دستگاه‌های قبلی غیرفعال هستند. همچنین لازم است یک هسته به اندازه کافی جدید و یک نسخه کافی جدید از سیستم عامل داشته باشید. جست‌وجوی paca و bti در /proc/cpuinfo به شما نشان می‌دهد که آیا سخت‌افزار به اندازه کافی جدید و یک هسته جدید به اندازه کافی دارید. اندروید 12 (API 31) پشتیبانی لازم از فضای کاربری را دارد.

جوانب مثبت:

  • می‌تواند در همه بیلدها بدون ایجاد مشکل در دستگاه‌ها یا هسته‌های قدیمی‌تر فعال شود (اما مطمئن شوید که واقعاً روی ترکیبی از دستگاه/هسته/سیستم‌عامل که از آن پشتیبانی می‌کند تست کرده‌اید!)

معایب:

  • فقط برای برنامه های 64 بیتی موجود است
  • خطاها را در دستگاه هایی که از آن پشتیبانی نمی کنند، کاهش نمی دهد
  • سربار اندازه کد 1٪

GWP-Asan

GWP-ASan را می توان برای تشخیص خطاهای حافظه در میدان مورد استفاده قرار داد، اما نرخ نمونه برداری برای کاهش موثر آن بسیار کم است.

جوانب مثبت:

  • بدون سربار CPU یا حافظه قابل توجهی
  • بی اهمیت برای استقرار: نیازی به بازسازی کد بومی ندارد
  • برای برنامه های 32 بیتی کار می کند

معایب:

  • نرخ نمونه برداری پایین به تعداد زیادی از کاربران نیاز دارد تا اشکالات را به طور موثر پیدا کنند
  • فقط خطاهای پشته را تشخیص می دهد، نه خطاهای پشته

HWASan

ضدعفونی کننده آدرس سخت افزاری که با نام HWASan نیز شناخته می شود، بهترین گزینه برای تشخیص خطاهای حافظه در طول آزمایش است. زمانی که با تست خودکار استفاده می شود بسیار مفید است، به خصوص اگر در حال اجرای تست های فازی هستید، اما بسته به نیازهای عملکرد برنامه شما ممکن است در تلفن های پیشرفته در تنظیمات آزمایشی نیز قابل استفاده باشد.

جوانب مثبت:

  • بدون مثبت کاذب
  • کلاس های اضافی از خطاهایی را که ASan نمی تواند شناسایی کند (استفاده از پشته پس از بازگشت)
  • نرخ منفی کاذب کمتر از MTE (1 در 256 در مقابل 1 در 16)
  • سربار حافظه کمتر از ASan، نزدیکترین جایگزین آن

معایب:

  • CPU قابل توجه (~ 100٪)، اندازه کد (~50٪) و حافظه (10٪ - 35٪) سربار
  • تا API 34 و NDK r26، نیاز به فلش کردن یک تصویر سازگار با HWASan دارد.
  • فقط روی برنامه های 64 بیتی کار می کند

MTE

افزونه برچسب‌گذاری حافظه ، که به عنوان MTE نیز شناخته می‌شود، جایگزین ارزان‌تری برای HWASan است. علاوه بر قابلیت اشکال زدایی و تست، می توان از آن برای شناسایی و کاهش خرابی حافظه در تولید استفاده کرد. اگر سخت افزاری برای آزمایش ساخت های MTE دارید، باید آن را فعال کنید.

جوانب مثبت:

  • سربار به اندازه کافی کم است که در تولید برای بسیاری از برنامه ها قابل تحمل باشد
  • بدون مثبت کاذب
  • برای شناسایی خطاهای پشته به کد بازسازی نیاز ندارد (اما برای تشخیص خطاهای پشته نیاز دارد)

معایب:

  • هیچ دستگاه تجاری در دسترس نیست که MTE به طور پیش فرض در سال 2024 فعال باشد، اما مستندات Arm توضیح می دهد که چگونه MTE را برای آزمایش روی Pixel 8/Pixel 8 Pro فعال کنید .
  • نرخ منفی کاذب 1 در 16 در مقابل HWASan 1 در 256
  • فقط برای برنامه های 64 بیتی موجود است
  • نیاز به ساخت کتابخانه های جداگانه برای هدف قرار دادن دستگاه های دارای MTE و غیر فعال کننده MTE دارد

ASan

ضدعفونی کننده آدرس که با نام ASan نیز شناخته می شود، قدیمی ترین و در دسترس ترین ابزار موجود است. برای تشخیص خطاهای حافظه در حین تست و اشکال زدایی که فقط دستگاه های قدیمی را تحت تأثیر قرار می دهد که هیچ یک از ابزارهای دیگر در دسترس نیستند، مفید است. در صورت امکان، HWASan را ترجیح دهید.

جوانب مثبت:

  • به طور گسترده در دسترس است. ممکن است روی دستگاه هایی به قدمت کیت کت کار کند
  • در صورت استفاده صحیح، هیچ مثبت یا منفی کاذب وجود ندارد

معایب:

  • ساخت و بسته بندی صحیح مشکل است
  • بالاترین سربار از همه گزینه ها: ~ 100٪ CPU، ~ 50٪ اندازه کد، ~ 100٪ استفاده از حافظه
  • دیگر پشتیبانی نمی شود
  • دارای اشکالات شناخته شده ای است که رفع نمی شود
،

اندروید از چندین ابزار برای رفع اشکال خطاهای حافظه پشتیبانی می کند. برای هرکدام معاوضه هایی وجود دارد، بنابراین برای تصمیم گیری در مورد بهترین مورد برای استفاده شما، زیر را بخوانید. این سند به شما یک نمای کلی از ابزارهای موجود می دهد تا بتوانید تصمیم بگیرید که کدامیک را بیشتر بررسی کنید، اما هدف آن مختصر است، بنابراین برای جزئیات، اسناد مخصوص ابزار را بخوانید.

tl;dr

  • برای غیرممکن کردن خطاهای حافظه تا حد امکان از یک زبان امن برای حافظه استفاده کنید
  • همیشه از PAC/BTI برای کاهش حملات ROP/JOP استفاده کنید
  • همیشه از GWP-ASan برای تشخیص خطاهای حافظه نادر در تولید استفاده کنید
  • از HWASan برای تشخیص خطاهای حافظه در طول آزمایش استفاده کنید
  • دستگاه‌های دارای قابلیت MTE معمولاً در سال 2023 در دسترس نیستند، اما اگر قادر به تشخیص خطا در تولید هستید، از آن استفاده کنید.
  • از ASan در طول آزمایش فقط به عنوان آخرین راه حل استفاده کنید

زبان های ایمن حافظه

زبان امن حافظه تنها راه برای جلوگیری و کاهش خطاهای حافظه است. سایر ابزارهای موجود در این صفحه می‌توانند به شما کمک کنند تا کد ناامن حافظه خود را ایمن‌تر و قابل اعتمادتر کنید، اما استفاده از یک زبان ایمن حافظه کل مشکلات را برطرف می‌کند.

زبان‌های ایمن حافظه رسمی پشتیبانی شده برای اندروید جاوا و کاتلین هستند. توسعه اکثر برنامه های اندروید به یکی از آن زبان ها آسان تر است.

با این اوصاف، کدهای ارسال برنامه‌نویسان برنامه وجود دارد که به زبان Rust نوشته شده‌اند، و اگر در حال خواندن این صفحه هستید، احتمالاً دلیل خوبی برای نیاز به کد بومی (قابل حمل، عملکرد یا هر دو) دارید. Rust بهترین انتخاب برای کد بومی ایمن حافظه در اندروید است. تیم NDK لزوماً نمی تواند به شما در رفع مشکلاتی که در صورت رفتن به آن مسیر با آن مواجه می شوید کمک کند، اما ما علاقه مندیم در مورد آنها بشنویم !

PAC/BTI

احراز هویت اشاره‌گر و شناسایی هدف شاخه ، که با نام PAC/BTI نیز شناخته می‌شود، ابزارهای کاهشی مناسب برای استفاده در تولید هستند. اگرچه فناوری‌های مجزا هستند، اما توسط یک پرچم کامپایلر کنترل می‌شوند، بنابراین همیشه با هم استفاده می‌شوند.

این ویژگی‌ها با دستگاه‌هایی که از آن‌ها پشتیبانی نمی‌کنند سازگار هستند، زیرا دستورالعمل‌های جدید مورد استفاده در دستگاه‌های قبلی غیرفعال هستند. همچنین لازم است یک هسته به اندازه کافی جدید و یک نسخه کافی جدید از سیستم عامل داشته باشید. جست‌وجوی paca و bti در /proc/cpuinfo به شما نشان می‌دهد که آیا سخت‌افزار به اندازه کافی جدید و یک هسته جدید به اندازه کافی دارید. اندروید 12 (API 31) پشتیبانی لازم از فضای کاربری را دارد.

جوانب مثبت:

  • می‌تواند در همه بیلدها بدون ایجاد مشکل در دستگاه‌ها یا هسته‌های قدیمی‌تر فعال شود (اما مطمئن شوید که واقعاً روی ترکیبی از دستگاه/هسته/سیستم‌عامل که از آن پشتیبانی می‌کند تست کرده‌اید!)

معایب:

  • فقط برای برنامه های 64 بیتی موجود است
  • خطاها را در دستگاه هایی که از آن پشتیبانی نمی کنند، کاهش نمی دهد
  • سربار اندازه کد 1٪

GWP-Asan

GWP-ASan را می توان برای تشخیص خطاهای حافظه در میدان مورد استفاده قرار داد، اما نرخ نمونه برداری برای کاهش موثر آن بسیار کم است.

جوانب مثبت:

  • بدون سربار CPU یا حافظه قابل توجهی
  • بی اهمیت برای استقرار: نیازی به بازسازی کد بومی ندارد
  • برای برنامه های 32 بیتی کار می کند

معایب:

  • نرخ نمونه برداری پایین به تعداد زیادی از کاربران نیاز دارد تا اشکالات را به طور موثر پیدا کنند
  • فقط خطاهای پشته را تشخیص می دهد، نه خطاهای پشته

HWASan

ضدعفونی کننده آدرس سخت افزاری که با نام HWASan نیز شناخته می شود، بهترین گزینه برای تشخیص خطاهای حافظه در طول آزمایش است. زمانی که با تست خودکار استفاده می شود بسیار مفید است، به خصوص اگر در حال اجرای تست های فازی هستید، اما بسته به نیازهای عملکرد برنامه شما ممکن است در تلفن های پیشرفته در تنظیمات آزمایشی نیز قابل استفاده باشد.

جوانب مثبت:

  • بدون مثبت کاذب
  • کلاس های اضافی از خطاهایی را که ASan نمی تواند شناسایی کند (استفاده از پشته پس از بازگشت)
  • نرخ منفی کاذب کمتر از MTE (1 در 256 در مقابل 1 در 16)
  • سربار حافظه کمتر از ASan، نزدیکترین جایگزین آن

معایب:

  • CPU قابل توجه (~ 100٪)، اندازه کد (~50٪) و حافظه (10٪ - 35٪) سربار
  • تا API 34 و NDK r26، نیاز به فلش یک تصویر سازگار با HWASan دارد.
  • فقط روی برنامه های 64 بیتی کار می کند

MTE

افزونه برچسب‌گذاری حافظه ، که به عنوان MTE نیز شناخته می‌شود، جایگزین ارزان‌تری برای HWASan است. علاوه بر قابلیت اشکال زدایی و تست، می توان از آن برای شناسایی و کاهش خرابی حافظه در تولید استفاده کرد. اگر سخت افزاری برای آزمایش ساخت های MTE دارید، باید آن را فعال کنید.

جوانب مثبت:

  • سربار به اندازه کافی کم است که در تولید برای بسیاری از برنامه ها قابل تحمل باشد
  • بدون مثبت کاذب
  • برای شناسایی خطاهای پشته به کد بازسازی نیاز ندارد (اما برای تشخیص خطاهای پشته نیاز دارد)

معایب:

  • هیچ دستگاه تجاری در دسترس نیست که MTE به طور پیش فرض در سال 2024 فعال باشد، اما مستندات Arm توضیح می دهد که چگونه MTE را برای آزمایش روی Pixel 8/Pixel 8 Pro فعال کنید .
  • نرخ منفی کاذب 1 در 16 در مقابل HWASan 1 در 256
  • فقط برای برنامه های 64 بیتی موجود است
  • نیاز به ساخت کتابخانه های جداگانه برای هدف قرار دادن دستگاه های دارای MTE و غیر فعال کننده MTE دارد

ASan

ضدعفونی کننده آدرس که با نام ASan نیز شناخته می شود، قدیمی ترین و در دسترس ترین ابزار موجود است. برای تشخیص خطاهای حافظه در حین تست و اشکال زدایی که فقط دستگاه های قدیمی را تحت تأثیر قرار می دهد که هیچ یک از ابزارهای دیگر در دسترس نیستند، مفید است. در صورت امکان، HWASan را ترجیح دهید.

جوانب مثبت:

  • به طور گسترده در دسترس است. ممکن است روی دستگاه هایی به قدمت کیت کت کار کند
  • در صورت استفاده صحیح، هیچ مثبت یا منفی کاذب وجود ندارد

معایب:

  • ساخت و بسته بندی صحیح مشکل است
  • بالاترین سربار از همه گزینه ها: ~ 100٪ CPU، ~ 50٪ اندازه کد، ~ 100٪ استفاده از حافظه
  • دیگر پشتیبانی نمی شود
  • دارای اشکالات شناخته شده ای است که رفع نمی شود
،

اندروید از چندین ابزار برای رفع اشکال خطاهای حافظه پشتیبانی می کند. برای هرکدام معاوضه هایی وجود دارد، بنابراین برای تصمیم گیری در مورد بهترین مورد برای استفاده شما، زیر را بخوانید. این سند به شما یک نمای کلی از ابزارهای موجود می دهد تا بتوانید تصمیم بگیرید که کدامیک را بیشتر بررسی کنید، اما هدف آن مختصر است، بنابراین برای جزئیات، اسناد مخصوص ابزار را بخوانید.

tl;dr

  • برای غیرممکن کردن خطاهای حافظه تا حد امکان از یک زبان امن برای حافظه استفاده کنید
  • همیشه از PAC/BTI برای کاهش حملات ROP/JOP استفاده کنید
  • همیشه از GWP-ASan برای تشخیص خطاهای حافظه نادر در تولید استفاده کنید
  • از HWASan برای تشخیص خطاهای حافظه در طول آزمایش استفاده کنید
  • دستگاه‌های دارای قابلیت MTE معمولاً در سال 2023 در دسترس نیستند، اما اگر قادر به تشخیص خطا در تولید هستید، از آن استفاده کنید.
  • از ASan در طول آزمایش فقط به عنوان آخرین راه حل استفاده کنید

زبان های ایمن حافظه

زبان امن حافظه تنها راه برای جلوگیری و کاهش خطاهای حافظه است. سایر ابزارهای موجود در این صفحه می‌توانند به شما کمک کنند تا کد ناامن حافظه خود را ایمن‌تر و قابل اعتمادتر کنید، اما استفاده از یک زبان ایمن حافظه کل مشکلات را برطرف می‌کند.

زبان‌های ایمن حافظه رسمی پشتیبانی شده برای اندروید جاوا و کاتلین هستند. توسعه اکثر برنامه های اندروید به یکی از آن زبان ها آسان تر است.

با این اوصاف، کدهای ارسال برنامه‌نویسان برنامه وجود دارد که به زبان Rust نوشته شده‌اند، و اگر در حال خواندن این صفحه هستید، احتمالاً دلیل خوبی برای نیاز به کد بومی (قابل حمل، عملکرد یا هر دو) دارید. Rust بهترین انتخاب برای کد بومی ایمن حافظه در اندروید است. تیم NDK لزوماً نمی تواند به شما در رفع مشکلاتی که در صورت رفتن به آن مسیر با آن مواجه می شوید کمک کند، اما ما علاقه مندیم در مورد آنها بشنویم !

PAC/BTI

احراز هویت اشاره‌گر و شناسایی هدف شاخه ، که با نام PAC/BTI نیز شناخته می‌شود، ابزارهای کاهشی مناسب برای استفاده در تولید هستند. اگرچه فناوری‌های مجزا هستند، اما توسط یک پرچم کامپایلر کنترل می‌شوند، بنابراین همیشه با هم استفاده می‌شوند.

این ویژگی‌ها با دستگاه‌هایی که از آن‌ها پشتیبانی نمی‌کنند سازگار هستند، زیرا دستورالعمل‌های جدید مورد استفاده در دستگاه‌های قبلی غیرفعال هستند. همچنین لازم است یک هسته به اندازه کافی جدید و یک نسخه کافی جدید از سیستم عامل داشته باشید. جست‌وجوی paca و bti در /proc/cpuinfo به شما نشان می‌دهد که آیا سخت‌افزار به اندازه کافی جدید و یک هسته جدید به اندازه کافی دارید. اندروید 12 (API 31) پشتیبانی لازم از فضای کاربری را دارد.

جوانب مثبت:

  • می‌تواند در همه بیلدها بدون ایجاد مشکل در دستگاه‌ها یا هسته‌های قدیمی‌تر فعال شود (اما مطمئن شوید که واقعاً روی ترکیبی از دستگاه/هسته/سیستم‌عامل که از آن پشتیبانی می‌کند تست کرده‌اید!)

معایب:

  • فقط برای برنامه های 64 بیتی موجود است
  • خطاها را در دستگاه هایی که از آن پشتیبانی نمی کنند، کاهش نمی دهد
  • سربار اندازه کد 1٪

GWP-Asan

GWP-ASan را می توان برای تشخیص خطاهای حافظه در میدان مورد استفاده قرار داد، اما نرخ نمونه برداری برای کاهش موثر آن بسیار کم است.

جوانب مثبت:

  • بدون سربار CPU یا حافظه قابل توجهی
  • بی اهمیت برای استقرار: نیازی به بازسازی کد بومی ندارد
  • برای برنامه های 32 بیتی کار می کند

معایب:

  • نرخ نمونه برداری پایین به تعداد زیادی از کاربران نیاز دارد تا اشکالات را به طور موثر پیدا کنند
  • فقط خطاهای پشته را تشخیص می دهد، نه خطاهای پشته

HWASan

ضدعفونی کننده آدرس سخت افزاری که با نام HWASan نیز شناخته می شود، بهترین گزینه برای تشخیص خطاهای حافظه در طول آزمایش است. زمانی که با تست خودکار استفاده می شود بسیار مفید است، به خصوص اگر در حال اجرای تست های فازی هستید، اما بسته به نیازهای عملکرد برنامه شما ممکن است در تلفن های پیشرفته در تنظیمات آزمایشی نیز قابل استفاده باشد.

جوانب مثبت:

  • بدون مثبت کاذب
  • کلاس های اضافی از خطاهایی را که ASan نمی تواند شناسایی کند (استفاده از پشته پس از بازگشت)
  • نرخ منفی کاذب کمتر از MTE (1 در 256 در مقابل 1 در 16)
  • سربار حافظه کمتر از ASan، نزدیکترین جایگزین آن

معایب:

  • CPU قابل توجه (~ 100٪)، اندازه کد (~50٪) و حافظه (10٪ - 35٪) سربار
  • تا API 34 و NDK r26، نیاز به فلش کردن یک تصویر سازگار با HWASan دارد.
  • فقط روی برنامه های 64 بیتی کار می کند

MTE

افزونه برچسب‌گذاری حافظه ، که به عنوان MTE نیز شناخته می‌شود، جایگزین ارزان‌تری برای HWASan است. علاوه بر قابلیت اشکال زدایی و تست، می توان از آن برای شناسایی و کاهش خرابی حافظه در تولید استفاده کرد. اگر سخت افزاری برای آزمایش ساخت های MTE دارید، باید آن را فعال کنید.

جوانب مثبت:

  • سربار به اندازه کافی کم است که در تولید برای بسیاری از برنامه ها قابل تحمل باشد
  • بدون مثبت کاذب
  • برای شناسایی خطاهای پشته به کد بازسازی نیاز ندارد (اما برای تشخیص خطاهای پشته نیاز دارد)

معایب:

  • هیچ دستگاه تجاری در دسترس نیست که MTE به طور پیش فرض در سال 2024 فعال باشد، اما مستندات Arm توضیح می دهد که چگونه MTE را برای آزمایش روی Pixel 8/Pixel 8 Pro فعال کنید .
  • نرخ منفی کاذب 1 در 16 در مقابل HWASan 1 در 256
  • فقط برای برنامه های 64 بیتی موجود است
  • نیاز به ساخت کتابخانه های جداگانه برای هدف قرار دادن دستگاه های دارای MTE و غیر فعال کننده MTE دارد

ASan

ضدعفونی کننده آدرس که با نام ASan نیز شناخته می شود، قدیمی ترین و در دسترس ترین ابزار موجود است. برای تشخیص خطاهای حافظه در حین تست و اشکال زدایی که فقط دستگاه های قدیمی را تحت تأثیر قرار می دهد که هیچ یک از ابزارهای دیگر در دسترس نیستند، مفید است. در صورت امکان، HWASan را ترجیح دهید.

جوانب مثبت:

  • به طور گسترده در دسترس است. ممکن است روی دستگاه هایی به قدمت کیت کت کار کند
  • در صورت استفاده صحیح، هیچ مثبت یا منفی کاذب وجود ندارد

معایب:

  • ساخت و بسته بندی صحیح مشکل است
  • بالاترین سربار از همه گزینه ها: ~ 100٪ CPU، ~ 50٪ اندازه کد، ~ 100٪ استفاده از حافظه
  • دیگر پشتیبانی نمی شود
  • دارای اشکالات شناخته شده ای است که رفع نمی شود
،

اندروید از چندین ابزار برای رفع اشکال خطاهای حافظه پشتیبانی می کند. برای هرکدام معاوضه هایی وجود دارد، بنابراین برای تصمیم گیری در مورد بهترین مورد برای استفاده شما، زیر را بخوانید. این سند به شما یک نمای کلی از ابزارهای موجود می دهد تا بتوانید تصمیم بگیرید که کدامیک را بیشتر بررسی کنید، اما هدف آن مختصر است، بنابراین برای جزئیات، اسناد مخصوص ابزار را بخوانید.

tl;dr

  • برای غیرممکن کردن خطاهای حافظه تا حد امکان از یک زبان امن برای حافظه استفاده کنید
  • همیشه از PAC/BTI برای کاهش حملات ROP/JOP استفاده کنید
  • همیشه از GWP-ASan برای تشخیص خطاهای حافظه نادر در تولید استفاده کنید
  • از HWASan برای تشخیص خطاهای حافظه در طول آزمایش استفاده کنید
  • دستگاه‌های دارای قابلیت MTE معمولاً در سال 2023 در دسترس نیستند، اما اگر قادر به تشخیص خطا در تولید هستید، از آن استفاده کنید.
  • از ASan در طول آزمایش فقط به عنوان آخرین راه حل استفاده کنید

زبان های ایمن حافظه

زبان امن حافظه تنها راه برای جلوگیری و کاهش خطاهای حافظه است. سایر ابزارهای موجود در این صفحه می‌توانند به شما کمک کنند تا کد ناامن حافظه خود را ایمن‌تر و قابل اعتمادتر کنید، اما استفاده از یک زبان ایمن حافظه کل مشکلات را برطرف می‌کند.

زبان‌های ایمن حافظه رسمی پشتیبانی شده برای اندروید جاوا و کاتلین هستند. توسعه اکثر برنامه های اندروید به یکی از آن زبان ها آسان تر است.

با این اوصاف، کدهای ارسال برنامه‌نویسان برنامه وجود دارد که به زبان Rust نوشته شده‌اند، و اگر در حال خواندن این صفحه هستید، احتمالاً دلیل خوبی برای نیاز به کد بومی (قابل حمل، عملکرد یا هر دو) دارید. Rust بهترین انتخاب برای کد بومی ایمن حافظه در اندروید است. تیم NDK لزوماً نمی تواند به شما در رفع مشکلاتی که در صورت رفتن به آن مسیر با آن مواجه می شوید کمک کند، اما ما علاقه مندیم در مورد آنها بشنویم !

PAC/BTI

احراز هویت اشاره‌گر و شناسایی هدف شاخه ، که با نام PAC/BTI نیز شناخته می‌شود، ابزارهای کاهشی مناسب برای استفاده در تولید هستند. اگرچه فناوری‌های مجزا هستند، اما توسط یک پرچم کامپایلر کنترل می‌شوند، بنابراین همیشه با هم استفاده می‌شوند.

این ویژگی‌ها با دستگاه‌هایی که از آن‌ها پشتیبانی نمی‌کنند سازگار هستند، زیرا دستورالعمل‌های جدید مورد استفاده در دستگاه‌های قبلی غیرفعال هستند. همچنین لازم است یک هسته به اندازه کافی جدید و یک نسخه کافی جدید از سیستم عامل داشته باشید. جست‌وجوی paca و bti در /proc/cpuinfo به شما نشان می‌دهد که آیا سخت‌افزار به اندازه کافی جدید و یک هسته جدید به اندازه کافی دارید. اندروید 12 (API 31) پشتیبانی لازم از فضای کاربری را دارد.

جوانب مثبت:

  • می‌تواند در همه بیلدها بدون ایجاد مشکل در دستگاه‌ها یا هسته‌های قدیمی‌تر فعال شود (اما مطمئن شوید که واقعاً روی ترکیبی از دستگاه/هسته/سیستم‌عامل که از آن پشتیبانی می‌کند تست کرده‌اید!)

معایب:

  • فقط برای برنامه های 64 بیتی موجود است
  • خطاها را در دستگاه هایی که از آن پشتیبانی نمی کنند، کاهش نمی دهد
  • سربار اندازه کد 1٪

GWP-Asan

GWP-ASan را می توان برای تشخیص خطاهای حافظه در میدان مورد استفاده قرار داد، اما نرخ نمونه برداری برای کاهش موثر آن بسیار کم است.

جوانب مثبت:

  • بدون سربار CPU یا حافظه قابل توجهی
  • بی اهمیت برای استقرار: نیازی به بازسازی کد بومی ندارد
  • برای برنامه های 32 بیتی کار می کند

معایب:

  • نرخ نمونه برداری پایین به تعداد زیادی از کاربران نیاز دارد تا اشکالات را به طور موثر پیدا کنند
  • فقط خطاهای پشته را تشخیص می دهد، نه خطاهای پشته

HWASan

ضدعفونی کننده آدرس سخت افزاری که با نام HWASan نیز شناخته می شود، بهترین گزینه برای تشخیص خطاهای حافظه در طول آزمایش است. زمانی که با تست خودکار استفاده می شود بسیار مفید است، به خصوص اگر در حال اجرای تست های فازی هستید، اما بسته به نیازهای عملکرد برنامه شما ممکن است در تلفن های پیشرفته در تنظیمات آزمایشی نیز قابل استفاده باشد.

جوانب مثبت:

  • بدون مثبت کاذب
  • کلاس های اضافی از خطاهایی را که ASan نمی تواند شناسایی کند (استفاده از پشته پس از بازگشت)
  • نرخ منفی کاذب کمتر از MTE (1 در 256 در مقابل 1 در 16)
  • سربار حافظه کمتر از ASan، نزدیکترین جایگزین آن

معایب:

  • CPU قابل توجه (~ 100٪)، اندازه کد (~50٪) و حافظه (10٪ - 35٪) سربار
  • تا API 34 و NDK r26، نیاز به فلش کردن یک تصویر سازگار با HWASan دارد.
  • فقط روی برنامه های 64 بیتی کار می کند

MTE

افزونه برچسب‌گذاری حافظه ، که به عنوان MTE نیز شناخته می‌شود، جایگزین ارزان‌تری برای HWASan است. علاوه بر قابلیت اشکال زدایی و تست، می توان از آن برای شناسایی و کاهش خرابی حافظه در تولید استفاده کرد. اگر سخت افزاری برای آزمایش ساخت های MTE دارید، باید آن را فعال کنید.

جوانب مثبت:

  • سربار به اندازه کافی کم است که در تولید برای بسیاری از برنامه ها قابل تحمل باشد
  • بدون مثبت کاذب
  • برای شناسایی خطاهای پشته به کد بازسازی نیاز ندارد (اما برای تشخیص خطاهای پشته نیاز دارد)

معایب:

  • هیچ دستگاه تجاری در دسترس نیست که MTE به طور پیش فرض در سال 2024 فعال باشد، اما مستندات Arm توضیح می دهد که چگونه MTE را برای آزمایش روی Pixel 8/Pixel 8 Pro فعال کنید .
  • نرخ منفی کاذب 1 در 16 در مقابل HWASan 1 در 256
  • فقط برای برنامه های 64 بیتی موجود است
  • نیاز به ساخت کتابخانه های جداگانه برای هدف قرار دادن دستگاه های دارای MTE و غیر فعال کننده MTE دارد

ASan

ضدعفونی کننده آدرس که با نام ASan نیز شناخته می شود، قدیمی ترین و در دسترس ترین ابزار موجود است. برای تشخیص خطاهای حافظه در حین تست و اشکال زدایی که فقط دستگاه های قدیمی را تحت تأثیر قرار می دهد که هیچ یک از ابزارهای دیگر در دسترس نیستند، مفید است. در صورت امکان، HWASan را ترجیح دهید.

جوانب مثبت:

  • به طور گسترده در دسترس است. ممکن است روی دستگاه هایی به قدمت کیت کت کار کند
  • در صورت استفاده صحیح، هیچ مثبت یا منفی کاذب وجود ندارد

معایب:

  • ساخت و بسته بندی صحیح مشکل است
  • بالاترین سربار از همه گزینه ها: ~ 100٪ CPU، ~ 50٪ اندازه کد، ~ 100٪ استفاده از حافظه
  • دیگر پشتیبانی نمی شود
  • دارای اشکالات شناخته شده ای است که رفع نمی شود