C++26 cuối cùng đã cấm trình biên dịch xóa vòng lặp vô tận
Trước đây, viết while (true); trong C++ có thể khiến trình biên dịch tiện tay xóa luôn vòng lặp và chạy tiếp đoạn code phía sau.
Đề xuất P2809R3 của C++26 vừa chính thức xóa bỏ undefined behavior (hành vi không xác định) cho các vòng lặp vô tận đơn giản, theo bài viết của lập trình viên Sandor Dargo. Theo quy tắc "forward-progress" từ thời C++11, trình biên dịch mặc định rằng mọi vòng lặp rồi sẽ kết thúc, thực hiện I/O, hoặc truy cập dữ liệu dùng chung. Nếu một vòng lặp while (true); trơ trọi không làm mấy việc đó, các công cụ tối ưu như Clang có thể xóa sạch nó — khiến chương trình chạy tuột sang các hàm hoàn toàn không liên quan phía dưới.
Vì sao lại quan trọng: Dân làm nhúng (bare-metal) và kernel rất hay dùng while (true); để dừng hẳn thiết bị khi gặp lỗi phần cứng nghiêm trọng. Khi bộ tối ưu xóa mất vòng lặp đó, phần cứng vẫn cứ tiếp tục thi hành lệnh trong tình trạng dữ liệu đã bị hỏng. C11 đã sửa cái bẫy này từ nhiều năm trước, nhưng C++ thì đến tận bây giờ mới chịu lấp.
Cần biết thêm: Để đạt chuẩn C++26, vòng lặp phải có phần thân hoàn toàn rỗng (; hoặc {}) và chứa biểu thức hằng có giá trị true (như for (;;);). Các vòng lặp hợp lệ giờ sẽ an toàn nhường lượt xử lý thay vì kích hoạt undefined behavior. Nhờ ủy ban thông qua đề xuất dưới dạng báo cáo sửa lỗi (defect report), các đội làm trình biên dịch có thể mang bản vá này về áp dụng cho cả các chuẩn C++ cũ hơn.
Đoạn code xử lý sự cố của bạn cuối cùng cũng chịu nằm yên đúng chỗ bạn đặt nó.
Nguồn
- C++26: Trivial infinite loops are no longer undefined behaviour — https://www.sandordargo.com/blog/2026/09/16/cpp26-trivial-infinite-loops
- Hacker News Discussion — https://news.ycombinator.com/item?id=49746406

