FAQ C++ moderne et erreurs courantes

Ce ou ces sujets font partie d'une FAQ en cours d'écriture, vos retours sont les bienvenus.
Un comportement indéfini est relatif à l'exécution d'un code pour lequel le standard n'offre aucune garantie quant à son issue. On peut citer :
- l'accès à la valeur d'une variable non initialisée ;
- le déréférencement d'un pointeur non valide (note : un pointeur nul est la définition même d'un pointeur invalide) ;
- les accès tableaux hors limites ;
- un overflow (dépassement de valeur limite d'un type) ;
- l'utilisation d'un dangling pointer ;
- flush(stdin); ;
- et pleins d'autres cas.
Cette absence de contrainte donne alors à chaque compilateur la liberté de vous avertir ou non et/ou de générer le code qui lui plaît. Ce comportement peut dès lors se manifester (ou non) de diverses façons non prédictibles :
- une erreur de compilation ;
- un avertissement, si vous avez passé la bonne option de compilation ;
- l'obtention de valeurs aléatoires ;
- l'obtention de caractères aléatoires ;
- l'obtention de résultats erronés ;
- l'obtention d'un comportement non attendu ;
- un plantage durant l'exécution sur la partie précise relative au code erroné ;
- un plantage plus tard, rendant sa localisation plus difficile ;
- un plantage qui intervient de façon plus ou moins aléatoire ;
- un programme qui fonctionnera malgré tout comme espéré…
-
… mais pourra avoir un comportement différent si :
- vous ajoutez/supprimez du code,
- vous changez le niveau des optimisations (-O0, -O1…),
- changez de mode debug/release,
- vous utilisez un autre compilateur,
- vous exécutez le code sur un autre OS, une autre architecture (32/64 bits) ;
- et nombre d'autres comportements dont le formatage de votre disque dur ou la sortie de démons de votre nez comme aiment le dire certains avec le sourire.
Cette liberté permet cependant aux compilateurs d'effectuer des optimisations.
À voir également
- Undefined behavior
- C'est l'histoire d'un bogue
- code::dive 2017 – Andrzej Krzemieński – Faces of undefined behavior
- What Every C Programmer Should Know About Undefined Behavior 1/3, 2/3, 3/3
- A Guide to Undefined Behavior in C and C++ 1/3, 2/3, 3/3
- CppCon 2017: Piotr Padlewski “Undefined Behaviour is awesome!”
- CppCon 2017: John Regehr “Undefined Behavior in 2017” 1/2, 2/2
- Undefined Behavior in 2017 – Embedded in Academia
- P1705R1: Enumerating Core Undefined Behavior