« Undefined behavior » en C
Le comportement indéfini ou (undefined behavior) est un terme spécifique au langage C qu’il convient de bien connaitre.
Terminologie
Le comportement (behavior) du programme est son apparence externe, sa manifestation. Cela exclut les détails d’implémentation, ce qui se passe réellement au niveau du processeur, de la mémoire, etc.
Une implémentation est une environnement capable de traduire un code source écrit en C vers un programme exécutable qui se comporte selon les règles définies par la norme du C . Il est également capable d’exécuter un tel programme.
Un comportement régional
(locale-specific behavior)
est un comportement
qui varie en fonction du langage naturel dans lequel
s’exécute le programme. Un comportement
rtégional peut être le sens d’écriture des caractères
qui affichent du texte, ou le texte qui affiché par
strftime
. Il est attendu que ce comportement
soit documenté par l’implémenatation.
Un comportement non spécifié (unspecified behavior) est un comportement pour lequel la norme spécifie deux comportements ou plus pour un code source donneé. C’est à l’implémentation de déclarer quel comportement il adopte.
Un comportement indéfini (undefined behavior) est une construction du langage pour laquelle la norme du C ne spécifie aucun comportement, soit qu’il s’agit d’une construction indésirable ou d’une construction non prévue ou de la conséquence d’un comportement non spécifié sur laquelle aucune garantie n’est fournie. Il peut également s’agir d’un comportement dont la norme dit explicitement qu’il est indéfini. Dans ce cas indéfini doit être compris comme erroné.
Un comportement laissé à la discrétion de l’implémentation
(implementation-defined behavior)
est un comportement non spécifié que l’implémentation doit
documenter et sur lequel la norme ne spécifie aucune
garantie. Par exemple l’agencement en mémoire d’objets obtenus via des appels successifs à
malloc
.
Une limite d’implémentation
(implementation limit)
est une restriction que l’implémentation impose
à notre programme. Par exemple
le nombre d’arguments maximum que
printf
peut accepter.
Une panne ou arret (trap) est
un état dans lequel un programme n’exécute plus
aucune instruction. Cet état est imposé par
l’environnement d’exécution. Il peut survenir lorsque
celui-ci détecte un comportement indéfini par exemple,
mais il n’est pas garanti que le programme tombe
systématiquement en panne pour chaque comportement indéfini.
Aucune construction du C ne permet de se mettre en arrêt
de lui-même, il ne peut que s’agir d’une mesure
de sauvegarde imposée par l’environnement d’exécution.
while(true){}
, n’est pas un arrêt car ici le programme
exécute en boucle une seule et même instruction.
Depuis le C11 , un programme peut définir des gestionnaires de contraintes pour permettre un retour sur panne et maintenir le programme en état de fonctionnement malgré que l’environnement détecte que les limites d’implémentation soient dépassées.
Inventaire
Comportement non spécifié
Donner un exemple de chaque ub/unspecicified b.