ProgrammationDéveloppeur système, Développeur Backend

Qu'est-ce que le comportement indéfini (undefined behavior) en C++ et pourquoi est-il si dangereux ? Donnez des exemples et expliquez comment l'éviter.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Accès en dehors des limites d'un tableau
  • Utilisation de variables non initialisées
  • Libération d'une zone de mémoire deux fois
  • Utilisation de pointeurs pendants (dangling pointers)
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 :

  • Initialisez toujours les variables ;
  • Vérifiez les limites des tableaux/conteneurs ;
  • Évitez la gestion manuelle de la mémoire, utilisez des pointeurs intelligents.

Question piège.

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.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet.


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.