C 언어 기초
C 언어 규격에서 말하는 미정의 동작의 설명으로 올바른 것은?
- A규격이 아무것도 정하지 않은 동작으로, 컴파일러는 그것이 일어나지 않는다고 가정하고 최적화해도 되며, 예상하지 못한 결과가 되기도 한다
- B처리계마다 결과를 정하고, 그 결과를 문서에 적어 두는 것이 의무화되어 있는 동작
- C실행 시에 반드시 검출되어, 오류 메시지를 내고 프로그램이 멈추는 동작
정답과 해설 보기
정답: A. 규격이 아무것도 정하지 않은 동작으로, 컴파일러는 그것이 일어나지 않는다고 가정하고 최적화해도 되며, 예상하지 못한 결과가 되기도 한다
미정의 동작은 부호 있는 정수의 오버플로, 배열의 범위 밖 참조, NULL 포인터의 참조, 해제 후 사용 등과 같이 규격이 아무것도 요구하지 않는 동작입니다. 우연히 기대대로 동작하기도 하지만, 컴파일러는 '올바른 프로그램에서는 일어나지 않는다'고 가정하고 최적화해도 되므로, 최적화 설정이나 컴파일러의 버전을 바꾸기만 해도 결과가 바뀌는 경우가 있습니다. 이에 비해 int의 크기나 char의 부호 유무처럼 처리계가 정하고 문서에 적어야 하는 것을 처리계 정의 동작이라고 합니다. gcc나 clang에서는 -fsanitize=undefined를 붙이면 일부 미정의 동작을 실행 시에 검출할 수 있습니다.