Nguồn: iczelia.net

Tóm tắt

Kamila Szewczyk mô tả quá trình tìm và vá một bug trong Enlightenment E16 — window manager ra đời năm 1997 vẫn còn được dùng đến ngày nay. Bug xảy ra khi mở một file PDF có tên dài: toàn bộ desktop đóng băng hoàn toàn và có thể tái hiện 100% với cùng file. Phân tích với gdb xác định điểm nóng là hàm TextstateTextFitMB trong text.c, chịu trách nhiệm cắt ngắn tiêu đề cửa sổ quá dài bằng dấu “…” ở giữa (middle-ellipsis truncation).

Nguyên nhân gốc rễ là thuật toán tìm kiếm Newton-style không có giới hạn vòng lặp. Hàm ước tính số ký tự cần xóa (nuke_count) bằng cách dùng độ rộng pixel trung bình mỗi ký tự (cw = width / len_n) làm đạo hàm xấp xỉ. Với một số chuỗi đặc biệt — cụ thể là tiêu đề bài giảng có ký tự Unicode em-dash — Newton step dao động giữa hai trạng thái nuke_count = 8nuke_count = 11 vô hạn, không bao giờ hội tụ. Bug này tồn tại trong codebase từ năm 2006.

Fix bao gồm ba thay đổi phòng thủ: giới hạn vòng lặp tối đa 32 iteration (sau đó chấp nhận kết quả đầu tiên thỏa điều kiện fit, hoặc tăng nuke_count thêm 1); floor nuke_count ở mức 1 để tránh tạo chuỗi bất hợp lệ; và floor cw ở mức 1 để tránh chia cho 0 khi đo width ra 0. Cả ba thay đổi được áp dụng đối xứng cho cả hai hàm xử lý ASCII và multi-byte.

Đây là ví dụ điển hình về bug từ Newton’s method thiếu iteration limit — một lỗi kinh điển thường bị bỏ sót trong code production vì các trường hợp thông thường hội tụ nhanh và không bao giờ trigger điều kiện phân kỳ.

👉 Đọc bài gốc