« 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.