C++ 프로그래머들이 오랫동안 혼란을 겪었던 '단순 무한 루프'의 동작이 C++26 표준에서 명확히 정의됩니다. 이제 `while (true);`나 `for (;;);`처럼 조건이 항상 참이고 본문이 비어 있는 루프는 더 이상 미정의 동작이 아니며, 컴파일러가 최적화를 이유로 이를 임의로 제거할 수 없게 됩니다. 이는 C++11에서 도입된 전방 진행 보장 규칙이 단순 무한 루프를 미정의 동작으로 간주했던 문제를 해소하는 중요한 변화입니다.
기존 C++11의 전방 진행 보장 규칙은 모든 스레드가 결국 종료하거나, I/O 함수 호출, volatile 변수 접근, 동기화/원자적 연산 수행 중 하나를 할 것이라고 가정했습니다. 하지만 `while (true);`와 같은 단순 무한 루프는 이 중 어떤 항목도 수행하지 않아 미정의 동작으로 분류되었습니다. 이로 인해 Clang과 같은 일부 컴파일러는 해당 루프가 실행되지 않는다고 가정하고 루프를 제거한 뒤, 뒤에 배치된 코드를 실행시키는 사례가 발생하기도 했습니다. 이는 컴파일러 버그가 아니라 표준에 따라 허용되는 동작이었지만, 프로그래머의 의도와는 전혀 다른 결과를 초래했습니다.
이번 C++26의 변경은 특히 임베디드 시스템이나 커널 프로그래밍 분야에서 큰 의미를 가집니다. 이들 환경에서는 치명적인 오류 발생 시 시스템을 안전하게 정지시키기 위해 빈 무한 루프를 사용하는 '오류 시 정지(halt on error)' 패턴이 흔히 사용됩니다. 만약 컴파일러가 이러한 루프를 제거해버리면, 오류 처리기가 제대로 작동하지 않아 하드웨어가 손상되거나 보안 취약점으로 이어질 수 있었습니다. C++26은 C11 표준의 유사한 규칙을 참고하되, 문법적으로 빈 본문과 `true`로 평가되는 상수 표현식 조건을 갖춘 루프로 보호 대상을 명확히 한정하여 불필요한 최적화 제한을 피했습니다. 이 변경은 결함 보고서로도 채택되어 이전 C++ 표준 모드에도 소급 적용될 수 있습니다.
다만, 이번 변경에 대한 논쟁도 있습니다. C++26 표준은 단순 무한 루프 본문을 `std::this_thread::yield()` 호출로 대체하여 전방 진행 의미를 부여하는 방식을 제안합니다. 이는 라이브러리 호출이 전혀 없는 루프에 시스템 호출이 삽입될 수 있다는 점에서 일부 개발자들에게 '숨겨진 코드'로 비판받고 있습니다. 특히 베어메탈(bare-metal) 시스템과 같이 프리스탠딩(freestanding) 환경에서는 `yield()` 호출이 프로그래머가 의도하지 않은 동작을 유발할 수 있다는 우려도 제기됩니다. 그럼에도 불구하고, 이번 변화는 C++ 언어의 예측 가능성을 높이고 임베디드 시스템 개발자들이 더욱 안전하게 코드를 작성할 수 있도록 돕는 중요한 진전으로 평가됩니다.