지정되지 않은 동작

Unspecified behavior

지정되지 않은 동작은 프로그래밍 [clarification needed]언어의 구현에 따라 달라질 수 있는 동작입니다.프로그램은 소스 코드가 다른 컴파일러, 다른 설정을 가진 같은 컴파일러 또는 실제로 같은 실행 파일의 다른 부분에 컴파일되었을 때 다른 동작을 나타내는 실행 파일을 생성할 수 있는 경우 지정되지 않은 동작을 포함한다고 할 수 있습니다.각 언어 표준 또는 사양에 따라 다양한 동작이 발생할 수 있지만, 정확한 동작은 구현에 따라 다르며 프로그램의 소스 코드를 [1]검사하여 완전히 결정되지 않을 수 있습니다.지정되지 않은 동작은 종종 프로그램의 외부 동작에 나타나지 않지만, 때때로 다른 출력이나 결과를 초래하여 잠재적으로 이식성 문제를 일으킬 수 있습니다.

정의.

컴파일러가 각각의 타깃플랫폼에 최적인 코드를 생성할 수 있도록 하기 위해 프로그래밍 언어 표준이 특정 소스 코드 구성에 [2]특정 동작을 부과하는 것은 아닙니다.가능한 모든 프로그램의 정확한 동작을 명시적으로 정의하지 못하는 것은 언어 사양의 오류나 약점으로 간주되지 않으며,[1] 그렇게 하는 것은 불가능합니다.C 및 C++ 언어에서는 이러한 비포터블구성은 일반적으로 다음 3가지 카테고리로 분류됩니다.구현 정의, 미지정 및 정의되지 않은 동작.[3]

지정되지 않은 동작의 정확한 정의는 다양합니다.C++ 에서는,[4] 「실장에 따라 달라지는, 올바른 형식의 프로그램 구축과 올바른 데이터의 동작」이라고 정의됩니다.또한 C++ 표준은 가능한 동작의 범위가 일반적으로 [4]제공된다는 점에 주목하고 있습니다.실장 정의 동작과는 달리 실장에서는 동작을 [4]문서화할 필요가 없습니다.이와 유사하게, C 표준은 이를 "두 개 이상의 가능성을 제공하고 어떤 [5]경우에도 선택된 추가 요구사항을 부과하지 않는" 행동이라고 정의한다.지정되지 않은 동작은 정의되지 않은 동작과 다릅니다.후자는 일반적으로 잘못된 프로그램 구성 또는 데이터의 결과이며,[6] 이러한 구성의 번역 또는 실행에 대한 요구사항은 없습니다.

구현 정의 동작

C 및 C++는 구현 정의 동작과 지정되지 않은 동작을 구별합니다.구현 정의 동작의 경우 구현은 특정 동작을 선택하여 문서화해야 합니다.C/C++의 예는 정수 데이터 유형의 크기입니다.동작 선택은 주어진 프로그램 실행 내에서 문서화된 동작과 일치해야 합니다.

하위 표현식의 평가 순서

많은 프로그래밍 언어에서는 완전한 표현의 하위 표현식의 평가 순서를 지정하지 않습니다.이러한 비결정론에 의해, 예를 들면 병렬화를 이용하는 등, 특정의 플랫폼에 최적인 실장할 수 있습니다.하나 이상의 하위 표현식에 부작용이 있는 경우, 전체 표현식의 평가 결과는 하위 표현식의 [1]평가 순서에 따라 다를 수 있습니다.예를 들어,

a = f(b) + g(b); 

,어디에f그리고.g둘 다 수정하다b, 결과는 에 저장됩니다.a유무에 따라 다를 수 있다f(b)또는g(b)먼저 [1]평가됩니다.C 및 C++ 언어에서는 함수 인수에도 적용됩니다.예:[2]

#실패하다 <iostream> 인트 f() {   표준::외치다 << > "F 단위입니다.\n";   돌아가다 3; }  인트 g() {   표준::외치다 << > "단위는 g입니다.\n";   돌아가다 4; }  인트 (인트 i, 인트 j) {   돌아가다 i + j; }  인트 주된() {   돌아가다 (f(), g());  } 

결과 프로그램은 출력의 두 줄을 지정되지 않은 [2]순서로 씁니다.Java와 같은 다른 언어에서는 피연산자와 함수 인수의 평가 순서가 명시적으로 [7]정의됩니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c d ISO/IEC(2009-05-29)ISO/IEC PDTR 24772.2: 언어 선택 및 사용을 통한 프로그래밍 언어의 취약성 회피 가이드라인
  2. ^ a b c Becker, Pete (2006-05-16). "Living By the Rules". Dr. Dobb's Journal. Retrieved 26 November 2009.
  3. ^ Henricson, Mats; Nyquist, Erik (1997). Industrial Strength C++. Prentice Hall. ISBN 0-13-120965-5.
  4. ^ a b c ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ © 1.3.13 미지정 동작 [defns.unspecified]
  5. ^ ISO/IEC(1999)ISO/IEC 9899:1999(E): 프로그래밍 언어 - C © 3.4.4 패러 1
  6. ^ ISO/IEC(2003)ISO/IEC 14882:2003(E): 프로그래밍 언어 - C++ © 1.3.12 정의되지 않은 동작 [defns.undefined]
  7. ^ 제임스 고슬링, 빌 조이, 가이 스틸, 길라드 브라차(2005).Java Language Specification, 제3판애디슨 웨슬리.ISBN 0-321-24678-0