بدترین باگ‌های تاریخ کامپیوتر: انفجار موشک ۳۷۰ میلیون دلاری

بدترین خطاهای تاریخ کامپیوتر، مجموعه‌ای دنباله‌دار از داستان معروف‌ترین و تاثیرگذارترین خطاهای برنامه‌نویسی است. بیش‌تر برنامه‌نویسان و مهندسان نرم‌افزار به ندرت پیش می‌آید که با چیزی شبیه به این داستان‌ها روبه‌رو شوند، اما با خواندن آن‌ها می‌توانند دید خوبی در زمینهٔ توسعه و استقرار نرم‌افزار به دست آورند. این خطاهای کامپیوتری تاثیر قابل توجهی بر روی افرادی گذاشته‌اند که آن‌ها را تجربه کرده‌اند؛ ما هم می‌توانیم درس‌‌های ارزشمندی را که از این اشتباهات آموخته‌‌اند، در کارها و پروژه‌های خود به کار بگیریم. دیگر خطاهای کامپیوتری این مجموعه: گروه سرمایه‌گذاری نایت، مدارگرد اقلیمی مریخ (به‌زودی) و تراک ۲۵ (به‌زودی)
موشک آریان ۵
موشک آریان ۵

در چهارم ژوئن سال ۱۹۹۶ نخستین موشک آریان ۵ موتورهای خود را روشن کرد و به سرعت شروع به دور شدن از «ساحل گویان» در فرانسه نمود. ۳۷ ثانیه بعد، موشک ۹۰ درجه در جهت نادرست چرخید و در کم‌تر از ۲ ثانیه بعد، در ارتفاع ۴ کیلومتری از سطح زمین، نیروهای آئرودینامیکی، تقویت‌کننده‌ها را شکافتند و از پایه اصلی جدا کردند. این اتفاق سیستم خودتخریبی موشک را فعال کرد و فضاپیما در آتشی عظیم از هیدروژن مایع نابود شد.

این پرتاب فاجعه‌بار که در حدود ۳۷۰ میلیون دلار هزینه داشت، باعث بررسی‌های گسترده‌ای شد. بخشی از ماموریت این موشک، کمک به تحقیقات علمی در مورد عمل‌کرد سپر مغناطیسی زمین (Magnetosphere) بود که با توجه به از بین رفتن محمولهٔ موشک، این تحقیقات نزدیک به ۴ سال به تعویق افتاد. به همین دلایل، آریان ۵ به عنوان یکی از گران‌ترین خرابی‌های نرم‌افزاری تاریخ شناخته شده است.

چه چیزی اشتباه پیش رفت؟

خطای پیش آمده به عنوان یک ایراد نرم‌افزاری در سیستم مرجع اینرسی (Inertial Reference System) موشک تشخیص داده شد. موشک از این سیستم، که معمولا به آن BH می‌گویند، استفاده می‌کرد تا تشخیص دهد که جهتش رو به بالا است یا پایین. این مقدار با یک متغیر ۶۴ بیتی float نمایش داده می‌شد که برای این کار کاملا کافی بود.

مشکلات زمانی شروع شدند که نرم‌افزار تلاش کرد مقدار این متغیر ۶۴ بیتی را که می‌توانست نماینده میلیاردها مقدار مختلف باشد، در یک متغیر ۱۶ بیتی integer با امکان نمایش تنها ۶۵۵۳۵ مقدار مختلف، جا دهد. در چندین ثانیه ابتدایی پرواز، موشک شتاب کمی داشت و بنابراین تبدیل بین این دو مقدار هم موفقیت‌آمیز بود. اما با افزایش سرعت موشک، مقدار متغیر ۶۴ بیتی از عدد ۶۵ هزار بیشتر شد و دیگر برای جا شدن در متغیر ۱۶ بیتی بیش از اندازه بزرگ بود. همین لحظه بود که پردازنده با یک خطای عمل‌وند (operand error) روبه‌رو شد و متغیر BH را با یک کد عارضه‌یابی مقداردهی کرد.

کدهای عارضه‌یابی یا تشخیصی مقادیری قراردادی هستند که در صورت رُخ دادن وضعیت‌های خاص (معمولا به خاطر برخوردن به ایرادهای مختلف) در یک متغیر ذخیره یا به صورت نتیجه تابع برگشت داده می‌شوند.

فقط ۳۹ ثانیه از پرتاب آریان ۵ گذشته بود که این فضاپیما در آتشی از هیدروژن مایع سوخت.
فقط ۳۹ ثانیه از پرتاب آریان ۵ گذشته بود که این فضاپیما در آتشی از هیدروژن مایع سوخت.

برای فضا رفتن، فضای کافی نیاز بود!

به زبان ساده‌تر، این موضوع مانند تلاش برای قرار دادن ۱۰ میلیون لیتر بستنی در یک یخچال معمولی است. احتمالا اولین بستنی‌ها راحت در یخچال جا می‌شوند؛ اما بعد از پر شدن آن، جایی برای بقیه بستنی‌ها نیست. به خاطر همین درهای یخچال باز می‌مانند و همه بستنی‌ها شروع به آب شدن می‌کنند.

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

میراث دردسرساز

عوامل مختلفی این شکست را پررنگ و ویژه می‌کنند. اول این‌ که پس از پرتاب موشک، دیگر نیازی به مقدار BH نبود و این تکه از کد، از نسخه قبلی موشک در کد پایه جا مانده بود. نسل قبلی آریان، یعنی آریان ۴، برای تراز کردن بعد از پرتاب به این قسمت از کد نیاز داشت. مورد دوم این‌ بود که کدی که توانایی گرفتن و اداره کردن این ایرادهای تبدیل را داشت به دلیل محدودیت‌های کارایی در سخت‌افزار آریان ۴ برای مقدار BH غیر فعال شده بود. در آریان ۵ این محدودیت‌ها وجود نداشت و می‌توانست این قسمت دوباره فعال شود.

عامل موثر نهایی، تغییر در نیازهای کاربر و به طور مشخص در برنامهٔ پرواز موشک بود. آریان ۵ با یک خط سیر بسیار تندتر نسبت به آریان ۴ پرتاب شد که منجر به سرعت عمودی بیش‌تری می‌‌شد. از آن‌جا که موشک سریع‌تر به فضا پرتاب می‌شد، احتمال این‌که مقدار BH با خطای تبدیل رو‌به‌رو شود هم بیش‌تر بود.

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

این مطلب قسمتی از مجموعه دنباله‌دار معروف‌ترین و تاثیرگذارترین خطاهای برنامه‌نویسی است که در کوئرامگ منتشر شده است. . هفتاد سال پیش، گریس هوپر (Grace Hopper) نخستین خطای کامپیوتری را کشف کرد؛ یک پروانه بین رله‌های کامپیوتر Harvard Mark II که با آن کار می‌کرد گیر افتاده بود. پیش از آن ایده باگ‌ها (Bugs) در زمینه‌های دیگر تعریف شده بود، اما با کشف آن پروانه، برای نخستین بار از اصطلاح اشکال‌زدایی (Debugging) در زمینهٔ کامپیوترها استفاده شد.

ترجمه از:

"The Worst Computer Bugs in History: The Ariane 5 Disaster", by Jamie Lynch

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