상위 질문
타임라인
채팅
관점

미지정 동작

위키백과, 무료 백과사전

Remove ads

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

정의

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

미지정 동작의 정확한 정의는 다양하다. C++에서는 "잘 구성된 프로그램 구성과 올바른 데이터에 대한 동작으로, 구현에 의존하는 것"으로 정의된다.[4] C++ 표준은 가능한 동작의 범위가 일반적으로 제공된다고도 명시한다.[4] 구현 정의 동작과 달리, 구현이 해당 동작을 문서화해야 하는 요건은 없다.[4] 마찬가지로, C 표준은 "두 가지 이상의 가능성을 제공하고 어떠한 경우에도 어느 것이 선택될지에 대한 추가 요구 사항을 부과하지 않는" 동작으로 정의한다.[5] 미지정 동작은 미정의 동작과 다르다. 후자는 일반적으로 잘못된 프로그램 구성 또는 데이터의 결과이며, 그러한 구성의 번역 또는 실행에 대한 요구 사항은 없다.[6]

Remove ads

구현 정의 동작

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

예시

하위 식 평가 순서

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

#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());
}

결과 프로그램은 두 줄의 출력을 미지정된 순서로 작성한다.[2] 자바와 같은 일부 다른 언어에서는 피연산자와 함수 인자의 평가 순서가 명시적으로 정의된다.[7]

같이 보기

각주

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads