Comportement indéfini (UB) — c'est un comportement de programme dont le résultat n'est pas défini par la norme du langage C. Le compilateur ou le système peuvent effectuer n'importe quelle action — d'une erreur invisibilité à un crash complet ou à la corruption des données.
Causes typiques de l'UB :
Comment minimiser l'UB :
int arr[5]; arr[10] = 0; // UB — sortie des limites du tableau int* p = NULL; *p = 42; // UB — déréférencement d'un pointeur NULL
Q : Que se passe-t-il si on divise un entier par zéro ?
_R : Selon la norme C (ISO C99 6.5.5), la division par 0 — c'est un comportement indéfini. Un crash, l'apparition de déchets ou même une sortie "logiquement correcte" sont possibles, mais la norme ne garantit aucun résultat.
int a = 10, b = 0; printf("%d", a / b); // Comportement indéfini
Histoire
Dans un des projets sur systèmes embarqués, un programmeur a écrit une boucle sur un tableau, entrant accidentellement en dehors de ses limites d'un élément. L'application fonctionnait normalement, mais un mois plus tard, d'autres données en mémoire ont commencé à être corrompues (erreurs intermittentes, difficiles à reproduire). Le problème n'a été trouvé qu'après un examen minutieux et une vérification par un analyseur statique.
Histoire
Un développeur comptait sur le fait que le résultat du déréférencement d'un pointeur NULL provoque toujours un crash, et donc n'a pas ajouté de vérifications pour NULL. Cependant, sur une plate-forme rare, cela entraînait une modification incorrecte (mais non fatale) de la mémoire, ce qui rompait d'autres structures et entraînait des bogues difficiles à détecter.
Histoire
Lors de la génération de nombres pseudo-aléatoires, une division était utilisée, et avec certaines valeurs des arguments d'entrée, une division par 0 survenait. Sur la plupart des plates-formes, le programme "plantait", mais sur l'une d'elles, le résultat était un nombre incorrect, ce qui a conduit à l'impossibilité de reproduire les bogues entre différents environnements.