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}
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ı.
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.
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.
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.
/* 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;
}
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.
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);
Bir modülü farklı bir sisteme taşıdığınızda şu soruları sorun:
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:
-Wall -Woverflow)INT_MAX, INT_MINBir 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.
| 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 |
Kazanın resmi analizi ESA tarafından kamuya açık olarak yayımlanmıştır:
Kitap serisini incele →