Saat `malloc` Merusak `JPGLoader` milik Serenity, atau: Rahasia Menang Lotre (2021)
(sin-ack.github.io)-
Mengapa
mallocmerusakJPGLoadermilik SerenityOS -
Menyelidiki bug pada SerenityOS di mana warna ditampilkan salah saat mendekode gambar JPG
- Awalnya terlihat seperti kebingungan antara RGB dan BGR, tetapi masalah tetap tidak terselesaikan bahkan setelah kode diperbaiki
-
Melacak masalah dengan bisecting
- Mulai mencari penyebab masalah dengan melakukan bisecting pada 1000 commit terbaru
- SerenityOS menggunakan pustaka standarnya sendiri, AK, yang mirip dengan STL di C++ tetapi lebih mudah dibaca
- Perubahan pada AK memengaruhi seluruh sistem operasi sehingga waktu build menjadi lama
-
Hasil bisect
- Menemukan commit yang menyebabkan masalah: commit yang mengimplementasikan
malloc_good_size() - Commit ini menambahkan fungsi yang mengoptimalkan ukuran alokasi memori untuk mengurangi pemborosan memori
- Menemukan commit yang menyebabkan masalah: commit yang mengimplementasikan
-
Penemuan yang mengejutkan
- Menyelidiki kemungkinan bahwa
HashTabledanVectoradalah penyebab masalah - Setelah kapasitas
HashTablediubah, masalah pun teratasi
- Menyelidiki kemungkinan bahwa
-
Iterasi komponen serial yang non-deterministik
JPGLoadermenyimpan komponen file JPG diHashTabledan menggunakannya secara iteratif- Urutan komponen yang non-deterministik menyebabkan masalah
-
Penyebab bug
- Menyimpan objek yang membutuhkan urutan ke dalam
HashTablelalu menggunakan iterator default - Nilai hash dari ID komponen secara kebetulan tersusun dalam urutan yang benar
- Saat ukuran
HashTableberubah, urutannya ikut berubah dan masalah pun muncul
- Menyimpan objek yang membutuhkan urutan ke dalam
-
Solusi
- Memperbaiki
JPGLoaderagar mengiterasi komponen secara deterministik - Menggunakan struktur data yang menjamin urutan alih-alih
HashTable
- Memperbaiki
-
Pemikiran akhir
- Masalah sederhana pun dapat mengungkap kesalahan besar
- Masalah diselesaikan sampai ke akar agar tidak terulang
-
Ucapan terima kasih
- Berterima kasih kepada rekan-rekan yang membantu proses debugging
- Banyak hal dipelajari selama proses menemukan dan memperbaiki bug
Ringkasan GN⁺
- Tulisan ini membahas proses melacak dan menyelesaikan bug decoding gambar JPG yang terjadi di SerenityOS
- Masalah yang muncul karena urutan non-deterministik pada
HashTablediselesaikan dengan mengubahnya menjadi urutan yang deterministik - Tulisan ini menunjukkan dengan baik pentingnya dan kompleksitas proses debugging perangkat lunak
- Proyek dengan fungsi serupa antara lain
libjpegdi Linux
Belum ada komentar.