미지정 동작

컴퓨터 프로그래밍에서 미지정 동작(unspecified behavior)은 프로그래밍 언어의 여러 구현에 따라 달라질 수 있는 동작이다. 소스 코드가 다른 컴파일러에서 컴파일되거나, 동일한 컴파일러에서 다른 설정으로 컴파일될 때, 또는 동일한 실행 파일의 다른 부분에서 다른 동작을 보이는 컴퓨터 프로그램은 미지정 동작을 포함한다고 할 수 있다. 해당 언어 표준이나 사양은 가능한 동작 범위를 부과할 수 있지만, 정확한 동작은 구현에 따라 다르며 프로그램의 소스 코드를 검사하여 완전히 결정되지 않을 수 있다.ISO/IEC (2009-05-29). ISO/IEC PDTR 24772.2: Guidance to Avoiding Vulnerabilities in Programming Languages through Language Selection and Use 미지정 동작은 결과 프로그램의 외부 동작에서 종종 나타나지 않지만, 때로는 다른 출력이나 결과를 초래하여 잠재적으로 이식성 문제를 일으킬 수 있다.

정의
컴파일러가 각 대상 플랫폼에 최적의 코드를 생성할 수 있도록, 프로그래밍 언어 표준은 주어진 소스 코드 구성에 대해 항상 특정 동작을 부과하지는 않는다. 모든 가능한 프로그램의 정확한 동작을 명시적으로 정의하지 않는 것은 언어 사양의 오류나 약점으로 간주되지 않으며, 그렇게 하는 것은 실현 불가능할 것이다. C 및 C++ 언어에서는 이러한 비-이식성 구성이 일반적으로 세 가지 범주로 분류된다: 구현 정의(implementation-defined), 미지정(unspecified), 그리고 미정의 동작(undefined behavior).

미지정 동작의 정확한 정의는 다양하다. C++에서는 "잘 구성된 프로그램 구성과 올바른 데이터에 대한 동작으로, 구현에 의존하는 것"으로 정의된다.ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §1.3.13 unspecified behavior [defns.unspecified] C++ 표준은 가능한 동작의 범위가 일반적으로 제공된다고도 명시한다. 구현 정의 동작과 달리, 구현이 해당 동작을 문서화해야 하는 요건은 없다. 마찬가지로, C 표준은 "두 가지 이상의 가능성을 제공하고 어떠한 경우에도 어느 것이 선택될지에 대한 추가 요구 사항을 부과하지 않는" 동작으로 정의한다.ISO/IEC (1999). ISO/IEC 9899:1999(E): Programming Languages - C §3.4.4 para 1 미지정 동작은 미정의 동작과 다르다. 후자는 일반적으로 잘못된 프로그램 구성 또는 데이터의 결과이며, 그러한 구성의 번역 또는 실행에 대한 요구 사항은 없다.ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §1.3.12 undefined behavior [defns.undefined]

구현 정의 동작
C와 C++는 구현 정의 동작과 미지정 동작을 구별한다. 구현 정의 동작의 경우, 구현은 특정 동작을 선택하고 이를 문서화해야 한다. C/C++에서 한 가지 예는 정수 데이터 유형의 크기이다. 동작 선택은 프로그램의 주어진 실행 내에서 문서화된 동작과 일치해야 한다.

예시
하위 식 평가 순서
많은 프로그래밍 언어는 완전한 식의 하위 식 평가 순서를 지정하지 않는다. 이러한 비결정성은 특정 플랫폼에 대한 최적의 구현을 허용할 수 있다(예: 병렬 처리 활용). 하나 이상의 하위 식이 부작용을 가질 경우, 전체 식을 평가한 결과는 하위 식의 평가 순서에 따라 달라질 수 있다. 예를 들어, a = f(b) + g(b);에서 f와 g가 모두 b를 수정하는 경우, f(b) 또는 g(b) 중 어느 것이 먼저 평가되는지에 따라 a에 저장되는 결과가 달라질 수 있다. C 및 C++ 언어에서는 이것이 함수 인자에도 적용된다. 예시:
#include <iostream>
int f() {
  std::cout << "In f\n";
  return 3;
}

int g() {
  std::cout << "In g\n";
  return 4;
}

int sum(int i, int j) {
  return i + j;
}

int main() {
  return sum(f(), g());
}
결과 프로그램은 두 줄의 출력을 미지정된 순서로 작성한다. 자바와 같은 일부 다른 언어에서는 피연산자와 함수 인자의 평가 순서가 명시적으로 정의된다.제임스 고슬링, 빌 조이, 가이 스틸, and Gilad Bracha (2005). The Java Language Specification, Third Edition. Addison-Wesley. 

 같이 보기 
 소프트웨어 이식성
 미정의 동작

 각주 

분류:컴퓨터 프로그래밍
분류:프로그래밍 언어 구현