ProgrammationDéveloppeur C

Qu'est-ce que le 'comportement indéfini' dans le langage C ? Donnez des exemples de son apparition et des moyens de minimiser de tels problèmes.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Accès en dehors des limites du tableau
  • Déréférencement d'un pointeur non initialisé/invalide
  • Division par 0
  • Modification de constantes

Comment minimiser l'UB :

  • Initialiser toujours les variables
  • Vérifier les indices des tableaux
  • Utiliser des analyseurs de code statiques et dynamiques (par exemple, valgrind, AddressSanitizer)

Exemple de code :

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

Question piège.

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.

Exemple de code :

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.