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