← Tüm makaleler

Ariane 5 Felaketi: Yazılım Hatası Nasıl Bir Roketi Mahvetti?

Tür taşması hatası ve miras yazılım varsayımının 500 milyon dolarlık bir roketi nasıl yok ettiğinin hikayesi

Ariane 5 Felaketi: Yazılım Hatası Nasıl Bir Roketi Mahvetti?

4 Haziran 1996 sabahı, Fransız Guyanası'ndaki Kourou uzay üssünden Ariane 5 roketi fırlatıldı. Roketin görevde taşıdığı dört bilimsel uydu, Avrupa'nın uzay programı için yılların çalışmasını ve yaklaşık 500 milyon dolar yatırımı temsil ediyordu.

Fırlatmadan 37 saniye sonra roket kontrolünü yitirdi. 39. saniyede yer kontrol istasyonu imha komutunu verdi. Ariane 5, milyonlarca parçaya dönüşerek okyanusa yağdı.

Kazanın tüm maliyeti — roketi, yükü ve geliştirme masraflarını sayarsak — yaklaşık 8 milyar dolar olarak tahmin edilmektedir.

Nedenini araştıran komisyon 6 hafta sonra raporunu yayımladı. Hata, 9 satırlık bir Ada kodunda saklıydı. Soruşturma bulgularının tamamı, ESA tarafından kamuya açık olarak yayımlanan Ariane 5 501 Uçuş Soruşturma Komisyonu Raporu'nda belgelenmiştir.

{youtube:PK_yguLapgA}


1. Ne Oldu: Teknik Hikaye

Ariane 5'in yönlendirme sistemi, uçuş bilgisayarına yatay ivme ve hız verileri sağlayan bir Atalet Referans Sistemi (IRS — Inertial Reference System) üzerine kuruluydu.

IRS içinde yatay hızı hesaplayan bir değişken vardı: BH (Biais Horizontal). Bu değişken, yazılımda 64-bit kayan noktalı (floating-point) bir sayı olarak hesaplanıyordu. Ardından bu değer, 16-bit işaretli tamsayıya (int16_t) dönüştürülüyordu:

int16_t bh = (int16_t)horizontal_velocity_fp;

Sorun şuydu: Ariane 5'in çok daha güçlü motorları, Ariane 4'e kıyasla çok daha yüksek bir yatay ivme üretiyordu. Bu ivme birikince BH değeri, 16-bit işaretli tamsayının tutabileceği maksimum değeri (32.767) aştı.

BH hesaplanan değer: ~52.768
int16_t maksimum  : 32.767
Sonuç             : OVERFLOW → İstisna (Exception)

Bir yazılım istisnası (exception) tetiklendi. Ancak bu hata yakalanmamıştı — istisna işleyici, ham hata durumu verisini doğrudan uçuş bilgisayarına gerçek uçuş verisi gibi gönderdi.

Uçuş bilgisayarı, aldığı değerin bir hata kodu olduğunu bilmiyordu. Geçerli bir yatay hız verisi olduğunu varsaydı ve buna göre dümen yüzeylerini maksimuma döndürdü. Roket kendi ekseninde dönmeye başladı. Aerodinamik kuvvetler gövdeyi parçaladı; güvenlik sistemi devreye girerek roketi havada patlattı.


2. Tekrar Kullanılan Kod: Miras Yazılımın Gizli Tehlikesi

Buradaki trajik ironi şudur: IRS yazılımı Ariane 4 için yazılmış ve onlarca görevde sorunsuz çalışmıştı.

Ariane 4'ün daha düşük performanslı motorları, BH değerinin hiçbir zaman 32.767'yi geçmediği anlamına geliyordu. Yazılım Ariane 4 koşulları için doğruydu. Geliştirme ekibi kodu Ariane 5'e taşıdığında, dinamiklerin farklılaştığını hesaba katmadı.

Ariane 4 maksimum BH: ~18.000  ← int16_t sınırının içinde
Ariane 5 maksimum BH: ~52.768  ← int16_t sınırını aşıyor

Bu, yazılım mühendisliğinde klasik bir tuzaktır: "Bu kod Ariane 4'te çalışıyordu, burada da çalışır" varsayımı.

Gömülü sistemlerde ortam değiştiğinde — farklı donanım, farklı hız aralıkları, farklı sensör değerleri — aynı kodun davranışı temelden değişebilir.


3. Hata Nerede Yatıyordu?

Soruşturma üç ayrı tasarım hatası saptadı:

Birincisi: Korumasız tip dönüşümü

Tamsayı taşması kontrol edilmeden bırakılmıştı. Güvenli bir dönüşüm şöyle görünmeliydi:

if (horizontal_velocity_fp > INT16_MAX || horizontal_velocity_fp < INT16_MIN) {
    /* Hata durumunu işle, geçerli son değeri kullan */
    bh = last_known_good_bh;
} else {
    bh = (int16_t)horizontal_velocity_fp;
}

İkincisi: Hata verisi uçuş verisi gibi iletildi

Hata yöneticisi, istisnayı sinyal hattı üzerinden geçerli veri gibi gönderiyordu. Hata durumlarının ayrı bir kanaldan — ya da en azından belirgin bir hata bayrağıyla — iletilmesi gerekirdi.

Üçüncüsü: Sistemik doğrulama eksikliği

Ariane 5 başlangıç koşulları, yani yüksek yatay ivme profili, IRS yazılımı için hiçbir zaman test edilmemişti. Yazılım yalnızca Ariane 4'ün çalışma zarfı (operational envelope) içinde test edilmişti.


4. Gömülü Programcı İçin Dersler

Bu kaza, gömülü sistemlerin gerçek dünya koşullarında nasıl davrandığını anlamak açısından bir ders kitabı niteliğindedir.

Ders 1: Her tamsayı dönüşümünü doğrulayın

/* Tehlikeli */
int16_t val = (int16_t)some_float;

/* Güvenli */
static int16_t safe_cast_to_i16(float f) {
    if (f > INT16_MAX) return INT16_MAX;
    if (f < INT16_MIN) return INT16_MIN;
    return (int16_t)f;
}

Ders 2: Varsayım değil, ölçüm

Bir değişkenin değer aralığı teorik olarak hesaplanmalı, ardından en kötü durum (worst-case) için test edilmelidir. "Bu değer hiçbir zaman bu kadar büyümez" bir varsayımdır — kodda yeri yoktur.

Ders 3: Hata durumlarını açıkça temsil edin

typedef struct {
    bool     valid;
    int16_t  value;
} Measurement;

/* Çağıran taraf her zaman valid bayrağını kontrol etmek zorunda */
Measurement irs_get_horizontal_velocity(void);

Ders 4: Ortam değiştiğinde kodu yeniden doğrulayın

Bir modülü farklı bir sisteme taşıdığınızda şu soruları sorun:


5. Sonraki Adımlar

Ariane 5 kazası, IEC 61508 ve DO-178C gibi kritik güvenlik yazılımı standartlarının geliştirilmesini hızlandırdı. Bugün aviyonik ve uzay sistemlerinde:

Siz de kendi projelerinizde benzer prensipleri uygulayabilirsiniz:

Bir satır eksik sınır kontrolü, 8 milyar dolarlık bir felakete yol açabilir. Ya da daha kötüsü — insan hayatına.


Özet

Hata Açıklama
Tip taşması 64-bit float → 16-bit int dönüşümü kontrol edilmedi
Hatalı varsayım Ariane 4 değer aralıkları Ariane 5'e uygulandı
Hata yönetimi İstisna, geçerli uçuş verisi olarak iletildi
Doğrulama eksikliği Yeni sistem koşulları hiç test edilmedi
Sonuç Fırlatmadan 39 saniye sonra tam kayıp

Birincil Kaynak

Kazanın resmi analizi ESA tarafından kamuya açık olarak yayımlanmıştır:

Ariane 5 501 Uçuş Soruşturma Komisyonu Raporu (ESA, 1996)

Kitap serisini incele →