Vụ `malloc` làm hỏng JPGLoader của Serenity, hay là: bí quyết trúng xổ số (2021)
(sin-ack.github.io)-
Vì sao
malloclàm hỏng JPGLoader của SerenityOS -
Điều tra một lỗi khiến màu sắc hiển thị sai khi giải mã ảnh JPG trong SerenityOS
- Ban đầu trông giống như sự nhầm lẫn giữa RGB và BGR, nhưng ngay cả sau khi sửa mã thì vấn đề vẫn không được giải quyết
-
Lần vết vấn đề bằng bisecting
- Bắt đầu tìm nguyên nhân bằng cách bisect khoảng 1000 commit gần đây
- SerenityOS dùng thư viện chuẩn riêng là AK, tương tự STL của C++ nhưng dễ đọc hơn
- Các thay đổi trong AK ảnh hưởng tới toàn bộ hệ điều hành nên thời gian build kéo dài
-
Kết quả bisect
- Tìm ra commit gây ra vấn đề: commit triển khai
malloc_good_size() - Commit này thêm tính năng tối ưu kích thước cấp phát bộ nhớ để giảm lãng phí bộ nhớ
- Tìm ra commit gây ra vấn đề: commit triển khai
-
Phát hiện bất ngờ
- Điều tra khả năng
HashTablevàVectorlà nguyên nhân của vấn đề - Sau khi thay đổi dung lượng của
HashTable, vấn đề được khắc phục
- Điều tra khả năng
-
Lặp qua các component tuần tự theo cách không xác định
- JPGLoader lưu các component của tệp JPG trong
HashTablevà lặp lại chúng - Thứ tự của các component không mang tính xác định nên đã gây ra vấn đề
- JPGLoader lưu các component của tệp JPG trong
-
Nguyên nhân của lỗi
- Lưu các đối tượng cần thứ tự vào
HashTablerồi dùng iterator mặc định - Giá trị hash của ID component tình cờ được sắp theo đúng thứ tự
- Khi kích thước
HashTablethay đổi, thứ tự cũng đổi theo và gây ra lỗi
- Lưu các đối tượng cần thứ tự vào
-
Cách khắc phục
- Sửa JPGLoader để lặp qua các component theo cách xác định
- Dùng cấu trúc dữ liệu bảo đảm thứ tự thay cho
HashTable
-
Suy nghĩ cuối cùng
- Một vấn đề đơn giản cũng có thể làm lộ ra sai lầm lớn
- Giải quyết tận gốc vấn đề để ngăn nó tái diễn
-
Lời cảm ơn
- Gửi lời cảm ơn tới các đồng nghiệp đã hỗ trợ gỡ lỗi
- Học được rất nhiều trong quá trình phát hiện và sửa lỗi
Tóm tắt của GN⁺
- Bài viết này nói về quá trình lần vết và sửa một lỗi giải mã ảnh JPG xảy ra trong SerenityOS
- Vấn đề do thứ tự không xác định của
HashTableđã được khắc phục bằng cách chuyển sang thứ tự xác định - Bài viết cho thấy rõ tầm quan trọng và độ phức tạp của quá trình gỡ lỗi phần mềm
- Một dự án có chức năng tương tự là
libjpegtrên Linux
Chưa có bình luận nào.