Quelle est la différence entre undefined, unspecified et implementation-defined behavior en C++ ?
Bonjour, collègues ! J'écris en C++ depuis environ six mois, et je rencontre constamment les termes undefined behavior (UB), unspecified behavior et implementation-defined behavior. Je lis souvent sur les forums que l'UB est "une chose effrayante" qui peut faire "exploser" un programme, mais je ne comprends pas complètement la différence entre ces trois concepts.
Par exemple, je sais que déréférencer un pointeur nul est un UB. Mais qu'en est-il de l'ordre d'évaluation des arguments d'une fonction ? J'ai écrit ce code :
```cpp
#include
int foo() { std::cout << "foo "; return 1; }
int bar() { std::cout << "bar "; return 2; }
int main() {
int x = foo() + bar(); // Quel ordre d'affichage ?
std::cout << x;
return 0;
}
```
Avec différents compilateurs (GCC et Clang), j'obtenais des sorties différentes : tantôt "foo bar 3", tantôt "bar foo 3". Le compilateur ne se plaignait pas, le code fonctionnait, mais le résultat était différent. Est-ce un UB ? Ou autre chose ?
Autre exemple : la taille du type `int`. Je sais que `sizeof(int)` peut être 4 octets sur une plateforme et 2 ou 8 sur une autre.
No answers yet.
Connectez-vous pour laisser une réponse
Blogs