Malloc ने Serenity के JPGLoader को कैसे बिगाड़ दिया, या: लॉटरी जीतने का तरीका (2021)
(sin-ack.github.io)-
malloc ने SerenityOS के JPGLoader को क्यों बिगाड़ दिया
-
SerenityOS में JPG इमेज decode करते समय रंग गलत दिखने वाले bug की जाँच की गई
- यह RGB और BGR के भ्रम जैसा लगा, लेकिन code बदलने के बाद भी समस्या हल नहीं हुई
-
Bisecting के ज़रिए समस्या का पता लगाना
- हाल के 1000 commits पर bisecting करके समस्या के कारण को ढूँढना शुरू किया गया
- SerenityOS अपनी standard library AK का उपयोग करता है, जो C++ के STL जैसी है लेकिन पढ़ने में अधिक आसान है
- AK में बदलाव पूरे operating system को प्रभावित करते हैं, इसलिए build time लंबा हो जाता है
-
Bisect के नतीजे
- समस्या पैदा करने वाला commit मिल गया:
malloc_good_size()को implement करने वाला commit - इस commit ने memory allocation size को optimize करके memory waste कम करने की सुविधा जोड़ी
- समस्या पैदा करने वाला commit मिल गया:
-
चौंकाने वाली खोज
- यह जाँचा गया कि शायद HashTable और Vector समस्या के कारण हों
- HashTable की capacity बदलने के बाद समस्या हल हो गई
-
Non-deterministic serial component iteration
- JPGLoader, JPG file के components को HashTable में store करता है और उन पर बार-बार iterate करता है
- components का क्रम non-deterministic होने के कारण समस्या हुई
-
bug का कारण
- ऐसे objects को HashTable में store किया गया जिन्हें क्रम की आवश्यकता थी, और default iterator का उपयोग किया गया
- component ID के hash value संयोग से सही क्रम में aligned थे
- HashTable का size बदलने से क्रम बदल गया और समस्या पैदा हुई
-
समाधान
- JPGLoader को components पर deterministic तरीके से iterate करने के लिए बदला गया
- HashTable की जगह ऐसा data structure इस्तेमाल किया गया जो क्रम की guarantee देता है
-
अंतिम विचार
- साधारण-सी समस्या भी बड़ी गलती को उजागर कर सकती है
- समस्या को जड़ से हल किया गया ताकि वह दोबारा न हो
-
आभार
- debugging में मदद करने वाले साथियों का धन्यवाद
- bug को खोजने और हल करने की प्रक्रिया में बहुत कुछ सीखा गया
GN⁺ का सार
- यह लेख SerenityOS में हुए JPG image decoding bug को ट्रैक करने और हल करने की प्रक्रिया पर है
- HashTable के non-deterministic क्रम से पैदा हुई समस्या को deterministic क्रम में बदलकर हल किया गया
- यह लेख software debugging process की अहमियत और जटिलता को अच्छी तरह दिखाता है
- मिलती-जुलती functionality वाले projects में Linux का libjpeg आदि शामिल हैं
अभी कोई टिप्पणी नहीं है.