67 votes

A C++ standard changé par rapport à l'utilisation de valeurs de durée indéterminée et un comportement indéfini en C++1y?

Comme Ne l'initialisation entraîner lvalue-à-rvalue de conversion? Est - int x = x; UB? la norme C++ est un exemple étonnant dans la section 3.3.2 Point de déclaration , dans laquelle un int est initialisé avec une valeur indéterminée:

int x = 12;
{ int x = x; }

Voici la deuxième x est initialisé avec son propre (durée indéterminée). - fin de l'exemple ]

Qui Johannes réponse à cette question l'indique, est un comportement indéfini, car il nécessite une lvalue-à-rvalue de conversion.

Dans le dernier C++1y projet de norme N3936 qui peut être trouvé ici cet exemple a changé:

unsigned char x = 12;
{ unsigned char x = x; }

Voici la deuxième x est initialisé avec son propre (durée indéterminée). - fin de l'exemple ]

A quelque chose de changé en C++1y à l'égard de durée indéterminée des valeurs et un comportement indéfini qui a entraîné ce changement dans l'exemple?

58voto

Shafik Yaghmour Points 42198

Oui, ce changement s'explique par des changements dans la langue qui en fait un comportement indéfini si une période indéterminée, la valeur est produite par une évaluation , mais avec quelques exceptions pour les unsigned caractères étroits.

Rapport de défaut 1787 dont le projet de texte peut être trouvé dans N39141 a été récemment accepté en 2014 et est incorporé dans le dernier projet de travail N3936:

La plus intéressante de changement à l'égard de durée indéterminée de valeurs à la section 8.5 le paragraphe 12 qui va de:

Si aucun initialiseur est spécifié pour un objet, l'objet est par défaut-initialisé; si l'initialisation est effectuée, un objet automatique ou dynamique durée de stockage a une valeur indéterminée. [ Remarque: les Objets statiques ou thread durée de stockage sont initialisé à zéro, voir 3.6.2. - la note de fin ]

(c'est moi qui souligne):

Si aucun initialiseur est spécifié pour un objet, l'objet est par défaut-initialisé. Lorsque le stockage d'un objet automatique ou dynamique de la durée de stockage est obtenu, l'objet a une durée indéterminée valeur, et si aucun d'initialisation est effectuée pour l'objet, qui l'objet conserve une valeur indéterminée jusqu'à ce que la valeur est remplacée (5.17 [expr.cul]). [Remarque: les Objets de l'électricité statique ou le fil de stockage la durée sont initialisé à zéro, voir 3.6.2 [de base.commencer.init]. la fin de l' remarque] Si une période indéterminée, la valeur est produite par une évaluation, la le comportement est indéfini, sauf dans les cas suivants:

  • Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de:

    • la deuxième ou la troisième opérande d'une expression conditionnelle (5.16 [expr.cond]),

    • l'opérande de droite de la virgule (5.18 [expr.virgule]),

    • l'opérande de fonte ou de la conversion en unsigned étroit le type de caractère (4.7 [conv.intégrale], 5.2.3 [expr.type.conv], 5.2.9 [expr.statique.distribution], 5.4 [expr.distribution]), ou

    • un jeté de la valeur de l'expression (article 5 [expr]),

    alors le résultat de l'opération est d'une valeur indéterminée.

  • Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de la droite opérande d'un simple opérateur d'affectation (5.17 [expr.cul]) dont la première l'opérande est une lvalue de unsigned étroit le type de caractère, une indéterminée la valeur remplace la valeur de l'objet visé par l' l'opérande de gauche.

  • Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de la expression d'initialisation lors de l'initialisation d'un objet de type unsigned étroit le type de caractère, cet objet est initialisé pour une durée indéterminée de la valeur.

et inclus l'exemple suivant:

[ Exemple:

int f(bool b) {
  unsigned char c;
  unsigned char d = c; // OK, d has an indeterminate value
  int e = d;           // undefined behavior
  return b ? d : 0;    // undefined behavior if b is true
}

- fin de l'exemple ]

On peut trouver ce texte dans N3936 qui est l'actuel projet de travail et d' N3937 est le C++14 DIS.

Avant C++1y

Il est intéressant de noter que, avant ce projet contrairement à C qui a toujours eu une bien spécifié notion de ce qui utilise des valeurs de durée indéterminée ne sont pas défini C++ utilisé le terme d'une valeur indéterminée, sans même le définir (en supposant que nous ne pouvons pas emprunter définition de C99) et aussi voir le rapport de défaut 616. Nous avons dû compter sur la underspecified lvalue-à-rvalue de conversion qui, dans le projet de C++11 est couvert dans la section 4.1 Lvalue-à-rvalue de conversion de l'alinéa 1 qui dit:

[...]si l'objet est non initialisée, un programme qui nécessite cette conversion a un comportement indéfini.[...]


Notes de bas de page:

  1. 1787 est une révision de rapport de défaut 616, nous pouvons trouver cette information dans N3903

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X