Esta pregunta se refiere a la adición de P0593 al último borrador de C ++ 20 .
Aquí está mi ejemplo:
#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]
}
¿Está este código bien definido para todas las entradas del último borrador?
La justificación expresada en P0593 deja bastante claro que el descomentar [2]
conduciría a un comportamiento indefinido debido a una violación estricta de alias, si los dos elementos de entrada del usuario difieren. Se supone que la creación del objeto implícito ocurre solo una vez, en el punto de malloc
; no se activa por la instrucción de asignación en foo
.
Para cualquier ejecución real del programa, existe un miembro del conjunto no especificado de objetos implícitos que haría que el programa esté bien definido. Pero no me queda claro si la elección de la creación implícita de objetos mencionada en [intro.object] / 10 debe hacerse cuando malloc
sucede; o si la decisión puede "viajar en el tiempo".
El mismo problema puede surgir para un programa que lee un blob binario en un búfer y luego toma una decisión de tiempo de ejecución sobre cómo acceder a él (por ejemplo, deserialización; y el encabezado nos dice si está surgiendo un flotante o un int).