Cette question se réfère à l'ajout de P0593 au dernier projet C ++ 20 .
Voici mon exemple:
#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]
}
Ce code est-il bien défini pour toutes les entrées du dernier projet?
La justification exprimée dans P0593 montre assez clairement que la non-mise en commentaire [2]
entraînerait un comportement indéfini en raison d'une violation stricte de l'alias, si les deux éléments d'entrée d'utilisateur diffèrent. La création d'objet implicite est censée se produire une seule fois, au point de malloc
; il n'est pas déclenché par l'instruction d'affectation dans foo
.
Pour toute exécution réelle du programme, il existe un membre de l'ensemble non spécifié d'objets implicites qui rendrait le programme bien défini. Mais il n'est pas clair pour moi si le choix de création d'objet implicite mentionné dans [intro.object] / 10 doit être fait lorsque malloc
cela se produit; ou si la décision peut "voyager dans le temps".
Le même problème peut survenir pour un programme qui lit un blob binaire dans un tampon puis prend une décision d'exécution sur la façon d'y accéder (par exemple, la désérialisation; et l'en-tête nous indique si un flottant ou un int est à venir).