Надеюсь, это не дубликат, я прочитал ряд связанных вопросов, но никто, похоже, не охватил этот случай:
#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;
}
Я думал, что это два случая одного и того же неопределенного поведения.Вывод равен 1233
, а я (наивно?) Ожидал 1234
.
Так что мой вопрос: почему компилятор не жалуется во втором случае и почему стек не переписывается, как в случае12
?Я что-то упустил?
(MinGW 4.5.2, -Wall -Wextra -pedantic)
РЕДАКТИРОВАТЬ: я знаю, что обсуждать результаты UB бессмысленно.Моя главная проблема заключалась в том, есть ли какая-либо более глубокая причина, по которой один обнаруживается компилятором, а другой нет.