J'espère qu'il ne s'agit pas d'un doublon, j'ai lu un certain nombre de questions connexes mais personne n'a semblé couvrir ce cas :
#include <iostream>
int* return_dangling_p()
{
int x = 1;
return &x; // warning: address of local variable 'x' returned
}
void some_func()
{
int x = 2;
}
int main(int argc, char** argv)
{
// UB 1
int* p = return_dangling_p();
std::cout << *p; // 1
some_func();
std::cout << *p; // 2, some_func() wrote over the memory
// UB 2
if (true) {
int x = 3;
p = &x; // why does compiler not warn about this?
}
std::cout << *p; // 3
if (true) {
int x = 4;
}
std::cout << *p; // 3, why not 4?
return 0;
}
Je pensais qu'il s'agissait de deux cas du même comportement indéfini. La sortie est 1233
alors que je m'attendais (naïvement ?) à ce que 1234
.
Ma question est donc la suivante : pourquoi le compilateur ne se plaint-il pas dans le second cas et pourquoi la pile n'est-elle pas réécrite comme dans le cas de 12
? Ai-je oublié quelque chose ?
(MinGW 4.5.2, -Wall -Wextra -pedantic)
EDIT : Je suis conscient qu'il est inutile de discuter des résultats de l'UB. Ma principale préoccupation était de savoir s'il y a une raison plus profonde pour laquelle l'un est détecté par le compilateur et l'autre non.