Stockage d'un pointeur invalide
Bien qu'il soit bien établi que le déréférencement d'un pointeur invalide conduit à un comportement indéfini, une question moins claire se pose : le fait de stocker une adresse mémoire invalide dans une variable de pointeur est-il lui-même un comportement indéfini ?
Considérez l'extrait de code suivant :
<code class="c++">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
Dans cet exemple, l'expression start - 1 est évaluée comme un adresse mémoire invalide. Cependant, l'adresse n'est pas explicitement déréférencée mais plutôt utilisée dans l'arithmétique des pointeurs pour déterminer sa validité.
Ce scénario est-il considéré comme un comportement indéfini ?
Intuitivement, certains pourraient affirmer que ce n'est pas le cas, puisque l'arithmétique des pointeurs repose souvent sur de telles opérations. De plus, les pointeurs sont intrinsèquement des entiers. Cependant, il a été affirmé que même le simple fait de stocker un pointeur invalide dans un registre peut constituer un comportement indéfini en raison d'implications architecturales potentielles (par exemple, des erreurs de bus).
Pour clarifier cette question, nous nous tournons vers le normes C ou C pertinentes. Malheureusement, cette question n’est toujours pas résolue par omission. La section 6.5.6/8 du projet de norme C décrit la sémantique de l'arithmétique du pointeur lorsque le pointeur pointe vers un élément du tableau et que le tableau est suffisamment grand ou lorsque l'opérande pointe après le dernier élément du tableau. Le comportement dans la situation décrite ci-dessus ne rentre pas dans ces cas précis. Par conséquent, stocker un pointeur invalide est par omission un comportement non dé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!