Esta pergunta refere-se à adição de P0593 ao rascunho C ++ 20 mais recente .
Aqui está o meu exemplo:
#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]
}
Esse código está bem definido para todas as entradas do rascunho mais recente?
O raciocínio expresso em P0593 deixa bastante claro que o descomentário [2]
levaria a um comportamento indefinido devido a uma violação estrita do alias, se os dois itens de entrada do usuário diferirem. A criação implícita de objetos deve acontecer apenas uma vez, no ponto de malloc
; não é acionado pela declaração de atribuição em foo
.
Para qualquer execução real do programa, existe um membro do conjunto não especificado de objetos implícitos que tornaria o programa bem definido. Mas não está claro para mim se a escolha da criação implícita de objetos mencionada em [intro.object] / 10 deve ser feita quando isso malloc
acontecer; ou se a decisão pode "viajar no tempo".
O mesmo problema pode surgir para um programa que lê um blob binário em um buffer e, em seguida, toma uma decisão em tempo de execução de como acessá-lo (por exemplo, desserialização; e o cabeçalho nos diz se um float ou int está chegando).