개요
Undefined behavior, unspecified behavior, implementation-defined behavior는 C/C++ 언어에서 프로그램이 특정 상황에 어떻게 동작해야하는지를 나타내는 용어이다.
Undefined behavior
개념
- 언어 명세가 프로그램의 동작을 명시하지 않은 상황을 가리킨다.
- 프로그램의 동작은 예측할 수 없으며 컴파일러, 하드웨어 및 기타 요소에 따라 달라질 수 있다.
- 언어 명세 (language specification)
- 프로그래밍 언어의 구문과 의미를 설명하는 문서이다.
- 언어의 문법, 구문 규칙, 다양한 상황에서의 행동에 대한 공식적인 설명을 담고있다.
- 언어 명세 (language specification)
대표적인 사례
Unspecified behavior
개념
- 언어 명세에서 여러 가지 유효한 동작을 허용하지만 어떤 동작이 나타날지는 지정하지 않은 상황을 말한다.
- 프로그램의 동작은 구현에 맡겨진다.
대표적인 사례
- 초기화되지 않은 변수의 값
- 다수의 스레드가 공유 리소스에 액세스하는 순서
- 함수의 인자가 evaluated되는 순서
- 예시.
func(a(), b())
라는 함수가 있을 때,a()
와b()
중 어떤 것이 먼저 계산될 지에 대한 순서
- 예시.
Implementation-defined behavior
개념
- 언어 명세가 여러 가지 유효한 동작을 허용하지만 구현이 어떤 동작을 나타낼 것인지 문서화해야 하는 상황을 의미한다.
- 프로그램의 동작은 구현에 따르지만, 프로그래머가 사전에 예측할 수 있도록 문서화되어야 한다.
대표적인 사례
- 자료형의 크기
- int형, long형의 크기
- 부동 소수점 타입이 나타낼 수 있는 값의 범위
printf
가 형식 지정자(format specifier)와 일치하지 않는 인자를 넘겨받았을 때의 동작