
C와 C++의 정의되지 않은 동작(UB)은 세그폴트만 일으키는 것이 아니라 컴파일러가 예상 밖의 코드를 만들 수도 있다고 블로그 글이 설명한다. 글은 std::unreachable()과 널 포인터 역참조 사례를 들며, GCC 16.2에 -O1을 적용했을 때의 어셈블리 출력을 제시한다.
첫 사례는 메모리 매핑 장치를 제어하는 상황을 가정한 코드다. serve_hot_chocolate()는 device_command에 42를 쓴 뒤 std::unreachable()을 호출하고, 별도 함수 explode()는 3을 쓴다. 글은 std::unreachable()이 정의되지 않은 동작을 일으키므로 프로그램이 예측 가능한 방식으로 동작한다고 볼 수 없다고 주장한다. 제시된 어셈블리에는 main이 device_command에 42를 쓰는 내용과 explode()의 별도 코드가 나온다.
글은 두 번째 사례에서 std::unreachable() 대신 int* ptr = nullptr; *ptr = 99;를 넣었다고 설명한다. 제시된 출력은 메모리 주소 0에 0을 쓰고 ud2 명령을 실행하며, 생성된 코드에는 99가 나타나지 않는다는 것이다.
이 예시는 특정 컴파일러와 최적화 설정에서 나온 결과다. 글은 독자들이 직접 살펴볼 수 있도록 첫 번째 예제의 Godbolt 링크와 추가 실험 링크를 제공한다. 앞서 다룬 C의 정의되지 않은 동작에 관한 글도 함께 연결했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요