Maison > développement back-end > C++ > Quelle est la différence entre un comportement indéfini et une mauvaise forme en C ?

Quelle est la différence entre un comportement indéfini et une mauvaise forme en C ?

Susan Sarandon
Libérer: 2024-11-21 18:23:16
original
617 Les gens l'ont consulté

What's the Difference Between Undefined Behavior and Ill-Formedness in C  ?

Distinguer un comportement non défini d'un comportement mal formé

Le comportement non défini (UB), le comportement mal formé et le comportement défini par la mise en œuvre sont des concepts distincts dans C. Cependant, la terminologie de la norme peut prêter à confusion, en particulier avec l'expression « mal formé ; aucun diagnostic requis ».

Programmes mal formés et diagnosticabilité

Un Le programme formé viole la syntaxe ou les règles sémantiques du langage. Selon la norme, il "est uniquement défini comme n'étant pas bien formé". Logiquement, cela implique qu'un programme mal formé ne doit pas être compilé.

Cependant, la norme autorise les implémentations à avoir des extensions mal formées selon la norme mais qui ne modifient pas le comportement des programmes bien formés. . Dans ces cas, l'implémentation doit diagnostiquer l'utilisation de l'extension mais est autorisée à poursuivre l'exécution.

Comportement non défini et diagnosticabilité

Le comportement non défini fait référence au comportement du programme qui ne peut pas être prédit par la norme. Les implémentations sont libres de définir le comportement de n'importe quelle manière, y compris en suspendant l'exécution ou en ignorant silencieusement le problème. Contrairement au mal formé, UB n'implique pas nécessairement que le programme ne doit pas compiler.

"Mal formé ; aucun diagnostic requis"

Le terme "mal formé ; aucun diagnostic requis" peut être interprété comme faisant référence à des situations dans lesquelles un programme viole les règles syntaxiques ou sémantiques, mais l'implémentation n'est pas requise pour diagnostiquer l'erreur. Cela le rendrait essentiellement équivalent à UB, sauf que les implémentations peuvent toujours se terminer ou continuer l'exécution en silence.

La raison de l'utilisation d'une telle formulation est susceptible de permettre une flexibilité dans la mise en œuvre. Il permet aux implémentations de gérer des erreurs qui seraient autrement mal formées d'une manière qui peut être utile dans la pratique.

Conclusion

Bien que la formulation de la norme C soit parfois incohérente , la règle générale est qu'un code erroné ou mal formé nécessite un diagnostic, sauf si la norme indique explicitement le contraire ou s'il s'agit d'un comportement indéfini. Dans le cas de « mal formé ; aucun diagnostic requis », cela est essentiellement synonyme de comportement indéfini, donnant aux responsables de la mise en œuvre une certaine latitude dans la manière dont ils gèrent certaines erreurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal