
La situation dans laquelle le code C ++ est syntaxiquement valide, mais son comportement n'est pas défini dans la norme, est souvent appelée comportement simplement non défini dans la littérature en langue russe. Dans la norme elle-même, pour de telles situations, il y a jusqu'à 3 termes: comportement non défini, comportement non spécifié et comportement défini par l'implémentation . Dans cette courte note, nous comprendrons en quoi ils diffèrent.
Comportement défini par l'implémentation
Ce terme est utilisé pour décrire des situations où le code C ++ est entièrement valide, mais son comportement dépend de l'implémentation (par exemple, le compilateur ou le runtime), et ce comportement est documenté . Par exemple, la taille en octets d'un pointeur ou d'un type int dépend de l'implémentation particulière ou des paramètres du compilateur, mais cela est décrit dans la documentation et vous pouvez vous fier à cette documentation.
Comportement non spécifié
Le terme signifie que le comportement du code C ++ valide n'est pas défini par la norme et dépend de l'implémentation, de plus, il n'est pas documenté (au moins officiellement). Exemple: la procédure de calcul des valeurs des arguments de fonction est déterminée par le compilateur, mais nulle part il n'y a une description de comment. La norme nous le dit: ce sont des caractéristiques comportementales qui ne sont fixées nulle part, par conséquent, vous ne pouvez pas vous y fier. Par conséquent, le comportement de votre code ne doit pas dépendre de ces fonctionnalités.
Comportement indéfini
Il s'agit de la variante d'incertitude la plus dangereuse. Dans la norme, il est utilisé pour décrire un comportement pouvant entraîner des conséquences totalement imprévisibles. Les exemples les plus frappants sont l'accès aux limites d'un tableau ou le déréférencement d'un pointeur vers un objet libéré. Le pire, c'est que le programme n'a pas à s'arrêter immédiatement ni même à produire une erreur, mais son comportement ne peut plus être invoqué.
En conclusion, je vous rappelle une fois de plus que tous les termes ci-dessus se réfèrent à du code syntaxiquement valide qui sera compilé avec succès (cependant, les compilateurs donnent souvent des avertissements pour les cas les plus évidents de comportement indéfini ). Un code non valide du point de vue de la norme est appelé programme mal formé .