موضوع مقاله: اشاره‌گر هیچ‌مقدار | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # اشاره‌گر هیچ‌مقدار | مقدمه: اشاره‌گر هیچ‌مقدار یا ارجاع هیچ‌مقدار در رایانش، یک دارای یک مقدار ذخیره شده‌است برای اینکه نشان دهد اشاره‌گر یا ارجاع به یک شی معتبر اشاره نمی‌کند. | ## بخش 1: اشاره‌گر هیچ‌مقدار | برنامه‌ها مرتباً از اشاره‌گرهای هیچمقدار استفاده می‌کنند تا شرایطی مانند پایان یک لیست با طول نامعلوم، یا شکست در اجرای برخی فعالیت‌ها را نشان دهند؛ این استفاده از اشاره‌گرهای هیچمقدار می‌تواند با انواع هیچمقدارپذیر و مقدار هیچ در یک نوع اختیار، مقایسه شود. یک اشاره‌گر هیچ‌مقدار نباید با اشاره‌گر تعریف نشده اشتباه گرفته شود: تضمین می‌شود مقایسه‌ی اشاره‌گر هیچ‌مقدار با هر اشاره‌گری که به یک شی معتبر اشاره می‌کند، نابرابر خواهد بود. اما با توجه به زبان و پیاده‌سازی، یک اشاره‌گر تعریف نشده ممکن است قادر به چنین تضمینی نباشد. ممکن است با بقیه‌ی اشاره‌گر های معتبر، بصورت برابر مقایسه شود، یا با اشاره‌گرهای هیچمقدار؛ و یا ممکن است در زمان های مختلف، هرکدام از این دو را انجام دهد. استاندارد c بیان نمی‌کند که اشاره‌گر هیچ‌مقدار با اشاره‌گر به آدرس حافظه‌ 0 برابر است، اگرچه در عمل این موضوع درست است.بازخوانی (dereference) یک اشاره‌گر هیچ‌مقدار در زبان c یک رفتار تعریف نشده است،و یک پیاده‌سازی تأیید کننده اجازه دارد تا نتیجه بگیرد که هر اشاره‌گری که مورد بازخوانی قرار گرفته، هیچمقدار نیست. در عمل، بازخوانی یک اشاره‌گر هیچ‌مقدار ممکن است باعث یک تلاش خواندن یا نوشتن در حافظه شود که نگاشته نشده، و باعث یک خطای قطعه‌بندی یا نقض دسترسی حافظه بشود. این موضوع ممکن است خود را بعنوان یک تصادم برنامه نشان دهد، یا تبدیل به یک خطای نرم‌افزاری شود که می‌تواند توسط کد برنامه خنثی شود. اما شرایط خاصی وجود دارند که مورد این نیست، برای مثال، در حالت واقعی x86، آدرس 0000:0000 قابل خواندن و همچنین معمولاً قابل نوشتن هم هست و بازخوانی یک اشاره‌گر به آن آدرس کاملاً معتبر است، اما معمولاً یک فعالیت ناخواسته به‌شمار می‌رود که ممکن است باعث رفتار تعریف نشده اما غیرمخرب در برنامه شود. مواقعی وجود دارند که بازخوانی اشاره‌گر به آدرس صفر عمداً انجام شده و خوش تعریف است؛ برای مثال، کد BIOS نوشته شده در c برای دستگاه‌های طرز واقعی x86 شانزده بیتی، ممکن است IDT را در آدرس فیزیکی 0 از ماشین با بازخوانی یک اشاره‌گر هیچ‌مقدار برای نوشتن، بنویسد. | ## بخش 2: اشاره‌گر هیچ‌مقدار | همچنین ممکن است که کامپایلر بازخوانی اشاره‌گر هیچ‌مقدار را به جهت دوری از خطای قطعه‌بندی بهینه‌سازی کند، اما باعث رفتار ناخواسته‌ دیگری بشود. اشاره‌گر ptr1 برابر است با آدرس متغیر عددی num بنابراین، شامل آدرس معتبری از حافظه است. نمونه ای از پیاده‌سازی این الگو را برای درک بهتر نحوه استفاده از اشاره‌گر Null در اینجا می‌‌توانید ببینید. دیگر زبان‌ها در برخی از محیط های زبان برنامه‌نویسی، مقدار استفاده شده در اشاره‌گر هیچ‌مقدار (که در Lisp به نام nil شناخته می‌شود) ممکن است درواقع اشاره‌گری به یک بلوک داخلی داده که برای پیاده‌سازی مفید است (اما به‌طور صریح از طریق برنامه‌های کاربر قابل دسترسی نیست)، بنابراین به همان ثبات اجازه داده می‌شود که بعنوان یک ثابت مفید و یک راه سریع برای دسترسی به پیاده‌سازی های داخلی مورد استفاده قرار بگیرد. در زبان‌های برنامه‌نویسی با معماری برچسب‌زده‌شده، یک اشاره‌گر احتمالاً هیچمقدار می‌تواند با یک اتحاد برچسب‌زده‌شده جابجا شود که باعث اجبار مدیریت صریح نمونه‌ی استثنایی شود؛ درواقع یک اشاره‌گر احتمالاً هیچمقدار می‌تواند بعنوان یک اشاره‌گر برچسب‌زده‌شده با برچسب محاسبه شده دیده شود. بازخوانی هیچمقدار چون یک اشاره‌گر هیچ‌مقدار به یک شی بامعنی اشاره نمی‌کند، یک تلاش برای بازخوانی (برای نمونه دسترسی به داده‌های ذخیره شده در آن آدرس حافظه) یک اشاره‌گر هیچ‌مقدار معمولاً (اما نه همیشه) باعث خطای زمان اجرا یا تصادم آنی برنامه می‌شود. پیاده‌سازی های زیادی باعث می‌شوند که اینگونه کد ها به متوقف شدن برنامه با نقض دسترسی ختم شوند، چون نمایش اشاره‌گر هیچ‌مقدار، انتخاب شده تا آدرسی باشد که هیچ‌گاه توسط سیستم برای ذخیره‌ی اشیاء تخصیص داده نمی‌شود. اگرچه گرفتن این استثناء ها به صورت عمومی یک عمل بد تلقی می‌شود، این نوع استثناء می‌تواند توسط برنامه گرفته و مدیریت شود. قبل از معرفی SMAP، یک باگ بازخوانی اشاره‌گر هیچ‌مقدار با نگاشتن pagezero به فضای آدرس مهاجم، به‌طور کامل قابل استخراج بود، در نتیجه باعث اشاره‌ی اشاره‌گر هیچ‌مقدار به آن ناحیه می‌شد. | ## بخش 3: اشاره‌گر هیچ‌مقدار | باند و دیگران پیشنهاد می‌کنند که JVM برای زیر نظر داشتن انتشار هیچمقدار تنظیم شود. ایده‌ی سیستم کسپر[9] استفاده از تبدیل سورس کد برای دنبال کردن این انتشار بدون تنظیم JVM، می‌باشد. تاریخچه در سال ۲۰۰۹ تونی هور بیان کرد که او در سال ۱۹۶۵ ارجاع هیچمقدار را بعنوان بخشی از زبان ALGOL W اختراع نموده‌است. در آن ارجاع سال ۲۰۰۹ وی اختراع خود را بعنوان «اشتباه میلیارد دلاری» توصیف کرد: من این را اشتباه میلیارد دلاری خود می‌خوانم. در آن زمان مشغول طراحی اولین سیستم نوع جامع برای ارجاع در یک زبان شی‌گرا (ALGOL W) بودم. هدفم این بود که اطمینان حاصل کنم که تمامی استفاده ها از ارجاع‌ها کاملاً امن هستند، با بررسی خودکار کامپایلر. اما نتوانستم در مقابل وسوسه‌ی گذاشتن یک ارجاع هیچمقدار مقاومت کنم، به دلیل اینکه پیاده‌سازی آن بسیار راحت بود. | ## جمع‌بندی | این موضوع به خطاها، آسیب‌پذیری ها و تصادم‌های سیستمی بیشماری منجر شد که احتمالاً باعث بوجود آمدن میلیارد ها دلار خسارت و درد در ۴۰ سال گذشته شده‌است.