Question

Tony rappelle il y a un [note] au paragraphe 1.3.12 de dire la norme C ++

  

gammes de comportement non défini admissibles d'ignorer la situation complètement avec des résultats imprévisibles, à se comporter lors de la traduction ou de l'exécution du programme dans une caractéristique de manière documentée de l'environnement ...

ne pas en contradiction avec la définition de UB dire que ... la présente Norme internationale impose aucune exigence ? Je veux dire qu'ils disent « pas d'exigences » et dire « UB admissible. » - droit dans le même paragraphe

Comment cette note doit être interprétée? Est-il limite en effet UB de quelque façon?

Était-ce utile?

La solution

De §6.5.1 de Partie 3 de la norme ISO / IEC directives:

  

Notes et exemples intégrés dans le   texte d'une norme ne doit être utilisé   pour donner des informations supplémentaires   destiné à faciliter la compréhension   ou l'utilisation de la norme et ne doit pas   contiennent des dispositions auxquelles il est   nécessaire pour se conformer afin d'être   en mesure de réclamer le respect de la   standard.

Il est donc tout à fait non-normative (non contraignante) et destiné uniquement pour les éclaircissements possibles.

Autres conseils

Comme le note ne sont pas normatives, il ne limite pas UB en aucune façon. Il est juste une clarification qu'une mise en œuvre pourrait utiliser certaines constructions qui formellement la cause UB comme une extension documentée, bien que tout programme qui repose sur les détails d'un tel est, bien sûr, en soi pas en toute sécurité portable à d'autres environnements.

Cette note est d'expliquer ce qu'est une mise en œuvre pourrait faire si elle rencontre le code pour lequel il est un comportement non défini. Le mot « admissible » ne vise pas à être une restriction plutôt sont donnés quelques exemples de comportements communs.

Il est intéressant de noter qu'un compilateur a presque toujours quelque chose à la compilation! Considérez ce fragment de code:

void f() { 1 / 0; }

le comportement du traducteur en rencontrant ce n'est pas bien définie, mais il ne peut pas le faire tout ce qu'il aime! En fait, si elle est un compilateur, il est toujours nécessaire de compiler cette unité de compilation. En effet, le comportement d'un programme contenant cette fonction pourrait encore être bien définie! Le compilateur ne peut pas savoir si la fonction est appelée. En fait, cette question a été soulevée lorsque la fonction était « principale () » et le contrôle était certain de circuler à travers la division zéro et le résultat est que le compilateur ne peut pas même rejeter ce programme. La raison en est. Le programme est encore bien formé, et un compilateur conforme est tenu d'accepter tous les programmes bien formés (et rejeter tous les mal formés et délivrer un message d'erreur de diagnostic, sauf indication contraire)

Cela ne peut pas être facilement fait mal formé car il est difficile de préciser exactement comment compilateurs intelligent peut être nécessaire pour être en détecter quand une division par zéro doit avoir lieu.

Fait intéressant, la demande de la norme qu'il « Impose aucune exigence » est en fait très proche de se tromper. Il est des caractéristiques d'un système de compilation supportant la compilation séparée qu'il ne peut pas détecter si un morceau de code pour lequel le comportement, il n'y a pas bien défini est, en fait, exécuté, et donc le compilateur est en fait requis quelque chose de toute façon la compilation, car il ne peut pas en déduire si le programme a un comportement non défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top