واقعاً یکی از باوفاترین ابزارهای برنامهنویسی، به نظرم، ASAN هست که دسترسیهای نادرست به حافظه رو تشخیص داده و سریعاً Process برنامهٔ ما رو توی گونی میکنه قبل از اینکه دچار Undefined Behavior یا دریافت Segmentation Fault از سیستمعامل بشیم و کلّی وقت خودمون رو صرف Debugging بکنیم.
این کد رو در نظر بگیرید:
کد بالا عملاً Undefined Behavior هست. چرا که ما داریم Iteratorها رو خراب میکنیم. امّا کد ممکن هست که در بیشتر مواقع (شایدم کمتر مواقع) رفتاری که انتظار داریم رو داشته باشه؛ چون Undefined Behavior هست. و چون دارید یک Constant Reference از شئ ارسال میکنید به تابع اگه خوششانس باشید و دچار Segmentation Fault هم بشید؛ با یک Stack Trace طولانی از Constructorها و Destructorهای ترکیده ممکن هست که روبهرو بشید و یکی دو ساعت بشینید دنبال پرتغالفروش بگردید.
امّا اگه همین کد رو با ASAN لینک و Compile بکنید. بلافاصله برنامه با خطای مشابه:
==29284==ERROR: AddressSanitizer: heap-use-after-free on address 0x6070000000c0
بسته میشه که اگه Log رو دقیق ناگه کنیم. داره توضیح میده که:
READ of size 7 at 0x6070000000c0 thread T1 ... 0x6070000000c0 is located 48 bytes inside of 72-byte region freed by thread T0 here ... previously allocated by thread T0 here ...
حافظهای که داریم زور میزنیم بخونیمش، قبلاً حذف شده ...
(دلیل اینکه تعداد خطوط خروجی زیاد هست. به خاطر اینکه داره کاملاً روندی که باعث خطا شده و توابعی که صدا زده شده رو توضیح میده. تند تند Scroll نکنید و بررسی بکنید.)