Le comportement indéfini (UB, undefined behavior) est une action dans le code dont le comportement n'est pas défini par la norme. Dans ces cas, le compilateur est libre de prendre n'importe quelle décision : le programme peut fonctionner différemment sur différentes plates-formes, compilateurs, ou même déclencher une guerre nucléaire (formellement !). L'utilisation d'UB est l'erreur la plus dangereuse en C++.
Exemples d'UB :
int* p = new int[2]; delete[] p; int x = p[1]; // UB : accès à la mémoire après libération
Pour éviter l'UB :
Que se passera-t-il avec le code suivant ?
int a = 42; int b = a++ + ++a;Quelle sera la valeur de
b?
Réponse :
Ce code provoque de l'UB, car il modifie et lit la variable a sans séquence de points de séquence (sequence points) entre les opérations. La norme ne garantit pas de résultat spécifique, et le compilateur peut produire n'importe quel résultat ou même générer du code inattendu.
Histoire Dans un projet de système de stockage de données, l'un des développeurs a permis un accès en dehors des limites d'un tableau dans une fonction bas niveau. L'UB se manifestait uniquement avec certaines données utilisateurs et conduisait à la corruption de la structure de fichier et à la perte de données clients.
Histoire Dans un projet pour microcontrôleurs, des constructions avec lecture de variables non initialisées étaient rencontrées. Les tests passaient, mais un an après la sortie du dispositif, des erreurs aléatoires en exploitation ont été révélées, causées par l'UB : les variables contenaient parfois des valeurs indésirables.
Histoire Dans un grand projet open-source, un descripteur a été découvert, libéré deux fois à partir de différentes parties du code. Cet UB se manifestait d'abord très rarement, mais dans les nouvelles versions du système d'exploitation, cela a conduit à des arrêts d'urgence fréquents.