이 질문은 최신 C ++ 20 초안 에 P0593 을 추가하는 것을 말합니다 .
내 예는 다음과 같습니다.
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
이 코드는 최신 초안의 모든 입력에 대해 잘 정의되어 있습니까?
P0593에 표현 된 이론적 근거 [2]
는 두 사용자 입력 항목이 다를 경우 주석 처리를 제거 하면 엄격한 앨리어싱 위반으로 인해 정의되지 않은 동작이 발생할 수 있음을 상당히 명확하게합니다 . 암시 적 객체 생성은 malloc
; 의 할당 문에 의해 트리거되지 않습니다 foo
.
프로그램의 실제 실행에는 프로그램을 잘 정의 할 수있는 지정되지 않은 암시 적 개체 집합의 멤버가 있습니다. 그러나 [intro.object] / 10에 언급 된 암시 적 객체 생성을 선택해야하는지 명확하지 않습니다 malloc
. 또는 결정이 "시간 여행"할 수 있는지 여부.
이진 블로 브를 버퍼로 읽어서 액세스하는 방법에 대한 런타임 결정을 내리는 프로그램 (예 : deserialization)에서 동일한 문제가 발생할 수 있습니다.