En C11:
- Il est explicitement non défini selon 6.3.2.1/2 si
a
n'a jamais son adresse (cité ci-dessous)
- Il pourrait être un piège de la représentation (ce qui provoque UB lors de l'accès). 6.2.6.1/5:
Certaines représentations objet n'a pas besoin de représenter une valeur du type d'objet.
Unsigned ints peut avoir piège des représentations (par exemple, si elle a 15 précision bits et 1 bit de parité, d'accéder a
pourrait provoquer une parité faute).
6.2.4/6 dit que la valeur initiale est de durée indéterminée et la définition de ce sous 3.19.2 est soit une valeur indéterminée ou d'un piège de la représentation.
Plus loin: C11 6.3.2.1/2, comme l'a souligné Pascal Cuoq:
Si la lvalue désigne un objet de stockage automatique de la durée qui aurait pu être
déclarée au registre de classe de stockage (n'a jamais eu son adresse), et que cet objet
est non initialisée (pas déclarée avec un initialiseur et aucune affectation n'a été
effectuée avant l'utilisation), le comportement est indéfini.
Ce n'est pas l'exception pour les types de caractères, de sorte que cette clause apparaît à se substituer à la discussion qui précède; accéder x
est immédiatement undefined même si pas de piège représentations existent. Cette clause a été ajoutée à C11 à l'appui de Itanium Cpu qui n'ont en réalité un piège état des registres.
Les systèmes sans piège des représentations: Mais que faire si nous jeter dans &x;
de sorte que le 6.3.2.1/2 objection ne s'applique plus, et nous sommes sur un système qui est connu pour avoir aucun piège des représentations? La valeur est une valeur indéterminée.
La définition de valeur quelconque dans 3.19.3 est un peu vague, cependant, il est précisé par le DR 451, qui conclut:
- Une valeur non initialisée dans les conditions décrites ci-dessus peuvent apparaître pour modifier sa valeur.
- Toute opération effectuée sur une période indéterminée valeurs sont d'une durée indéterminée de la valeur.
- Les fonctions de la bibliothèque présentent un comportement indéfini lorsqu'il est utilisé sur une période indéterminée valeurs.
- Ces réponses sont appropriées pour tous les types qui n'ont pas de piège représentations.
En vertu de la présente résolution, int a; &a; int b = a - a;
résultats en b
ayant une valeur indéterminée encore.
Notez que si la durée indéterminée de la valeur n'est pas passé à une fonction de la bibliothèque, nous sommes toujours dans le domaine de la non spécifiée comportement (pas un comportement indéterminé). Les résultats peuvent être bizarre, par exemple, if ( j != j ) foo();
pourrait appeler foo, mais les démons doivent rester caché dans la cavité nasale.