Ajout à un pointeur "char *" : UB ou pas ?
Le C 17 définit des règles d'ajout d'expressions intégrales aux pointeurs, précisant que un comportement non défini se produit lorsque le résultat dépasse les limites d'un tableau pointé. Cependant, la définition concerne spécifiquement les pointeurs pointant vers des éléments de tableaux.
Considérez l'extrait de code suivant :
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
La question se pose de savoir si la ligne (*) déclenche un comportement non défini. Malgré la réinterprétation de l'adresse d'un float en tant que pointeur char, elle ne pointe pas vers un tableau char. Ainsi, selon la définition citée, il semblerait s’agir d’un comportement indéfini. Pourtant, l'utilité de la macro offsetof serait gravement compromise si tel était le cas.
Cependant, C permet également de copier les octets sous-jacents de tout type trivialement copiable dans un tableau de caractères. Cette opération, qui peut être effectuée à l'aide de fonctions comme std::memcpy ou manuellement octet par octet, ne nécessite pas que l'objet d'origine soit un tableau.
Par conséquent, pour permettre à ces opérations par octet de réussir, le l'ajout d'expressions intégrales aux pointeurs doit être défini pour les pointeurs pointant vers les octets bruts des objets. Il n'est pas clair si ces octets forment implicitement un tableau ou constituent une exception spéciale aux règles générales d'addition. Néanmoins, l’une ou l’autre interprétation justifierait la validité de l’ajout dans l’exemple de code fourni. Par conséquent, l'ajout d'un pointeur "char *" dans ce contexte n'entraîne pas de comportement indéfini.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!