DOOM chạy 2,5 năm không tắt — rồi crash vì lỗi “gametic overflow” trên PDA
DOOM chạy 2,5 năm không tắt — rồi crash vì lỗi “gametic overflow” trên PDA

Hiện tượng và bối cảnh
Một người dùng để phiên bản DOOM chạy liên tục trên thiết bị PDA ASUS MyPal A620 trong khoảng 2,5 năm, với hệ điều hành Windows Mobile 2003, sử dụng một nguồn UPS tự làm để cấp điện ổn định. Sau thời gian dài đó, trò chơi đột ngột bị crash.
Nguyên nhân lỗi: giá trị “gametic” vượt ngưỡng
Trong DOOM, có một biến được gọi là gametic, dùng để đếm tick thời gian (tick = lần cập nhật đơn vị thời gian khi trò chơi chạy). Gametic được tăng liên tục với tốc độ khoảng 35 ticks / giây.
Biến gametic không được reset khi bắt đầu lại các bản demo hoặc ứng dụng tương tự, nên sau một thời gian dài, giá trị này cứ tăng mãi. Vì biến này được lưu trong số nguyên có dấu 32-bit (“signed 32-bit integer”), nên nó có giá trị cực đại là 2,147,483,647. Khi vượt qua giá trị đó, xảy ra hiện tượng tràn số nguyên (integer overflow), biến trở về giá trị âm, gây lỗi và làm trò chơi crash.
Thời gian để lỗi xuất hiện
Với tốc độ 35 ticks/giây, sẽ mất khoảng 1,95 năm để giá trị gametic đạt đến 2,147,483,647 ticks.
Trong trường hợp trò chơi hoặc bản port có tốc độ tick thấp hơn (ví dụ 30 Hz), thời gian có thể lâu hơn, khoảng 2,26 năm.
Trong thực tế, người dùng để trò chơi chạy khoảng 2,5 năm thì lỗi xuất hiện – phù hợp với dự đoán khi dùng thiết lập có tick rate thấp hơn hoặc có thời gian thiết bị “nghỉ” vài lúc.
Ý nghĩa & bài học rút ra
Lỗi tràn số nguyên (integer overflow) là một vấn đề lâu nay trong lập trình — nếu biến đếm không được thiết kế để xử lý khi đạt ngưỡng cực đại, thì khi sử dụng liên tục, lỗi kiểu này có thể xảy ra.
Trong các ứng dụng (như trò chơi, phần mềm server) nếu yêu cầu hoạt động lâu dài liên tục, nhà phát triển cần đảm bảo biến đếm được reset hoặc sử dụng kiểu dữ liệu có độ lớn hơn (ví dụ 64-bit) để tránh overflow.
Mặc dù lỗi này có vẻ “khó xảy ra” trong hầu hết trường hợp sử dụng thông thường, nó vẫn là minh chứng cho việc dù thiết bị cũ, phần mềm cũ, nếu để chạy thời gian dài, lỗi hiệu suất hay crash có thể xuất hiện không ngờ trước.