C의 UB는 '세그폴트 정도'가 아니다, 호출조차 안 한 함수가 실행된다
Attention people who think UB is fine
C에서 정의되지 않은 동작(UB)은 최악의 경우 세그폴트 정도라는 통념을 저자는 실제 컴파일 결과로 반박한다. std::unreachable()을 호출한 함수에서 GCC 16.2는 호출되지도 않은 explode()의 명령을 그대로 이어 붙였고, 널 포인터 역참조는 99 대신 0을 주소 0에 쓰고 비정상 명령으로 프로그램을 죽였다. 같은 UB라도 컴파일러가 무엇을 내놓을지는 예측할 수 없다는 것이 핵심이다.
컴파일러는 UB를 '탐지'할 의무가 전혀 없다. GCC와 clang을 의인화하자면, '널 포인터 역참조? 그런 일은 일어날 수 없으니 바이너리 크기를 줄이려고 이 함수의 명령 생성을 중단하겠다'라고 판단한 셈이다.