Malloc'ın Serenity'nin JPGLoader'ını bozduğu olay veya: Piyango kazanmanın sırrı (2021)
(sin-ack.github.io)-
malloc'ın SerenityOS'un JPGLoader'ını neden bozduğu
-
SerenityOS'ta JPG görüntülerini decode ederken renklerin yanlış gösterilmesine yol açan bir hata araştırılıyor
- Sorun RGB ile BGR'nin karıştırılması gibi görünse de, kod düzeltildikten sonra bile çözülmüyor
-
Bisecting ile sorunun izini sürme
- Son 1000 commit arasında bisecting yapılarak sorunun kaynağı bulunmaya başlanıyor
- SerenityOS, C++ STL'ye benzeyen ama daha okunabilir olan kendi standart kütüphanesi AK'yi kullanıyor
- AK'deki değişiklikler tüm işletim sistemini etkilediği için build süresi uzuyor
-
Bisect sonucu
- Soruna yol açan commit bulunuyor:
malloc_good_size()işlevini uygulayan commit - Bu commit, bellek ayırma boyutunu optimize ederek bellek israfını azaltan bir özellik ekliyor
- Soruna yol açan commit bulunuyor:
-
Şaşırtıcı keşif
- HashTable ve Vector'ın sorunun kaynağı olabileceği araştırılıyor
- HashTable'ın kapasitesi değiştirildikten sonra sorun çözülüyor
-
Deterministik olmayan seri bileşen yinelemesi
- JPGLoader, JPG dosyasının bileşenlerini HashTable içinde saklıyor ve bunları tekrar tekrar kullanıyor
- Bileşenlerin sırası deterministik olmadığı için sorun ortaya çıkıyor
-
Hatanın nedeni
- Sıralamanın gerekli olduğu nesneler HashTable içinde tutuluyor ve varsayılan iterator kullanılıyor
- Bileşen ID'lerinin hash değerleri tesadüfen doğru sıraya denk geliyor
- HashTable boyutunun değişmesiyle sıra bozuluyor ve sorun ortaya çıkıyor
-
Çözüm
- JPGLoader'ın bileşenler üzerinde deterministik şekilde yineleme yapması sağlanıyor
- HashTable yerine sıralamayı garanti eden bir veri yapısı kullanılıyor
-
Son düşünceler
- Basit bir sorun bile büyük hataları ortaya çıkarabilir
- Sorun kökten çözülerek tekrar yaşanması önleniyor
-
Teşekkür
- Debug sürecinde yardımcı olan çalışma arkadaşlarına teşekkür ediliyor
- Hatanın bulunup çözülmesi sürecinde çok şey öğreniliyor
GN⁺ özeti
- Bu yazı, SerenityOS'ta ortaya çıkan JPG görüntü decode hatasının izlenmesi ve çözülmesi sürecini ele alıyor
- HashTable'ın deterministik olmayan sıralamasından kaynaklanan sorun, deterministik sıraya geçilerek çözülüyor
- Yazı, yazılım debugging sürecinin önemini ve karmaşıklığını iyi gösteriyor
- Benzer işlevlere sahip projeler arasında Linux'un libjpeg'i de bulunuyor
Henüz yorum yok.