Pourquoi la phrase: «un comportement indéfini signifie que le compilateur peut faire tout ce qu’il veut» est-elle vraie?

Spécifiquement en référence à: https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/

Je suis un nouveau programmeur C ++ et j’apprends actuellement le comportement non défini et ses effets sur un programme. J’ai été lié spécifiquement au blog ci-dessus, qui dit que quand un comportement non défini se produit, tout peut arriver.

Il est mentionné à plusieurs resockets que le compilateur peut permettre que quoi que ce soit se produise lorsqu’un comportement indéfini se produit.

Quelles sont les causes spécifiques de ce phénomène et pourquoi cela se produit-il?

Rien ne “provoque” cela. Un comportement indéfini ne peut pas “se produire”. Aucune force mystique ne s’abat sur votre ordinateur et le crée soudainement pour créer des trous noirs à l’intérieur des chats.

Tout ce qui peut arriver lorsque vous exécutez un programme dont le comportement est indéfini est indiqué comme tel par la norme C ++. C’est un énoncé de marge de manœuvre, une excuse utile utilisée par les compilateurs pour émettre des hypothèses sur votre code afin de fournir des optimisations utiles.

Par exemple, si nous disons que le déréférencement de nullptr est indéfini (ce qui est le cas), aucun compilateur ne doit jamais vérifier qu’un pointeur n’est pas nullptr : il peut simplement supposer qu’un pointeur déréférencé ne sera jamais nullptr , et si ce n’est pas le cas sont le problème du programmeur.

En raison de la complexité incroyable des compilateurs, certaines de ces conséquences peuvent être assez inattendues .

Bien entendu, il n’est pas vrai que “tout peut arriver”. Votre ordinateur n’a ni le pouvoir physique ni l’autorité légale nécessaire pour instancier un trou noir à l’intérieur d’un chat. Mais comme C ++ est une abstraction, il semble juste que nous utilisions des abstractions pour apprendre aux gens à ne pas écrire de programmes avec un comportement non défini. Si vous programmez avec rigueur, en supposant que “tout peut arriver” si votre programme a un comportement indéfini, vous ne serez pas surpris par les conséquences plutôt inattendues, et vous ne serez pas tenté d’essayer de “contrôler” le résultat de quelque manière que ce soit.

Du sharepoint vue des normes C et C ++, le fait que certaines situations invoquent le “comportement indéfini” ne signifie ni plus ni moins que le fait que la norme n’impose aucune exigence quant à ce qu’une implémentation doit faire dans cette situation pour être conforme . Cela n’implique en aucun cas un jugement particulier sur le sharepoint savoir si les mises en œuvre destinées à des objectives sur une plate-forme donnée doivent se comporter de manière prévisible, ni si un comportement prévisible dans une telle situation peut être requirejs pour qu’une implémentation soit adaptée à de tels objectives sur de telles plates-formes.

Pour une raison quelconque, certains rédacteurs de compilateurs ont assimilé “la norme n’exige pas de X” à “il n’est pas nécessaire que les implémentations fassent X”, sans égard particulier pour les objectives auxquels leurs compilateurs seraient destinés, et sans égard à ce que des comportements pourraient être nécessaires pour atteindre ces objectives. Ce qui a provoqué un comportement indéfini du comportement indéfini, c’est que les auteurs du compilateur l’interprètent non pas comme une reconnaissance du fait qu’il peut exister certaines combinaisons de plate-forme et de champ d’application où le coût d’un comportement prévisible excède l’avantage, et les auteurs du compilateur devraient: faire preuve de jugement pour savoir quand, mais indiquer plutôt que les auteurs de la norme ont déjà exercé leur jugement que pour toutes les combinaisons de plate-forme et de domaine d’application, le coût d’un comportement prévisible l’emporterait sur les avantages, et il n’y a aucun besoin que les rédacteurs de compilateurs exercent leur jugement car les auteurs de la norme l’ont déjà fait.