Est-ce que & * NULL est bien défini en C?

Dans quelle (s) version (s) des normes C (le cas échéant), les éléments suivants sont-ils définis?

void foo(void) { char *nullPtr = NULL; &*nullPtr; } 

Notez que je n’atsortingbue le résultat à rien – la deuxième ligne est une simple déclaration.

Cela devrait être une question avec une réponse évidente, mais (comme cela semble être le cas trop souvent), j’ai entendu dire que beaucoup de gens disent que la réponse est “manifestement non définie” comme “manifestement définie”.

Sur une note plutôt connexe, qu’en est-il de ce qui suit? foo devrait-il produire une lecture de c?

 extern volatile char c; void bar(void) { volatile char *nonnullptr = &c; &*nonnullptr; } 

(Version C ++ de la même question: Est-ce que & * NULL est bien défini en C ++? )

Alors que les tentatives de déréférence d’un pointeur null provoquent un comportement indéfini, *nullPtr est donc illégal, &*nullPtr est parfaitement défini. Selon la note de bas de page 102 du projet de norme C11 :

Ainsi, & * E est équivalent à E (même si E est un pointeur nul), ….

Ceci est dû au fait que, pour le unaire & opérateur ( §6.5.3.2 ¶3 ):

Si l’opérande est le résultat d’un opérateur unaire * , ni cet opérateur ni l’opérateur & n’est évalué et le résultat est comme si les deux avaient été omis, ….

La norme C99 utilise le même langage, mais cela n’apparaît pas dans la norme C90 et ma lecture de cette norme est que &*nullPtr provoquerait en effet un comportement non défini dans les implémentations antérieures à C99.

A partir de la norme C90 (§ 6.3.2.3):

Le résultat de l’opérateur unary & (address-of) est un pointeur sur l’object ou la fonction désigné par son opérande ….

et:

L’opérateur unaire * indique l’indirection …. Si une valeur non valide a été atsortingbuée au pointeur, le comportement de l’opérateur unaire * n’est pas défini.

Curieusement, je ne vois aucune discussion sur ce changement dans la justification du C99 , bien que je puisse simplement ne pas le trouver.