C++26에서 무한 루프 정의된 동작으로 변경
Key Point
임베디드와 커널 코드의 오류 시 정지 패턴이 컴파일러에 의해 최적화되어 실행 흐름이 왜곡되는 보안 취약점을 C++26이 근본적으로 해결했습니다.
핵심 요약
- C++11부터 부작용 없는 while(true); 루프는 미정의 동작이었고 컴파일러가 이를 제거하거나 이후 코드를 실행할 수 있었다.
- C는 제어 표현식이 상수 표현식인 루프를 미정의 동작으로 보지 않았으나, C++는 이를 채택하지 않아 불필요한 차이가 생겼다.
- C++26의 제안 P2809R3는 '자명한 무한 루프(trivial infinite loop)'를 정의된 동작으로 변경했다.
- 자명한 무한 루프는 본체가 완전히 비어있고(; 또는 {}) 제어 표현식이 true로 평가되는 상수 표현식이어야 한다.
- 컴파일러는 이제 해당 루프를 std::this_thread::yield() 호출로 대체하며, 이는 특히 임베디드와 커널 코드의 오류 처리 패턴을 보호한다.
- 프리스탠딩 구현에서는 yield() 치환이 일어나지 않을 수 있으며, 이는 베어메탈 시스템의 의도적 정지 루프를 보존한다.