C++26, 무한 루프 더 이상 미정의 동작 아니다

“C++26부터 while(true); 같은 부작용 없는 무한 루프가 더 이상 미정의 동작이 아니게 된다. 기존에는 컴파일러가 루프가 종료된다고 가정해 제거할 수 있었고 Clang에서는 실제로 'Hello world!'가 출력되는 사례도 있었지만, P2809R3 채택으로 C11처럼 well-defined 동작이 되며 이전 표준 모드에도 결함 보고로 적용될 수 있다.”

AI 요약

C++26에서 부작용 없는 무한 루프(예: while(true);)가 더 이상 미정의 동작(UB)이 아니게 된다. C++11의 forward progress guarantee 도입 이후 이러한 루프는 UB로 취급되어 Clang 등 컴파일러가 루프를 제거하고 예기치 않은 코드를 실행하는 문제가 있었다. P2809R3 제안이 C++26에 채택되면서 이 문제가 해결되었으며, 해당 수정은 결함 보고서(defect report)로도 승인되어 이전 표준 모드에도 소급 적용될 수 있다.

핵심 포인트

  • C11은 상수 표현식 제어 루프의 종료를 가정할 수 없도록 규정했지만, C++은 이를 채택하지 않아 while(1);이 C에서는 정의되고 C++에서는 UB가 되는 괴리가 발생
  • Clang에서 while(true); 뒤에 Hello world!가 출력되는 사례가 대표적 UB 결과
  • 임베디드·커널 코드에서 치명적 오류 시 halt 패턴으로 쓰이는 while(true);가 최적화로 제거되면 하드웨어가 손상 상태로 계속 실행되는 위험 존재
  • P2809R3 제안으로 C++26에서 trivial infinite loop가 정의된 동작으로 변경

향후 전망

  • 최신 컴파일러에서 C++20 모드로도 수정이 적용되어 재현이 어려워질 수 있음
  • 임베디드·실시간 시스템의 오류 처리 코드 안정성 향상 기대
Share

이것도 읽어보세요

댓글

이 소식에 대한 의견을 자유롭게 남겨주세요.

댓글 (0)

불러오는 중...