Подтвердить что ты не робот

Действительно ли это C? Нет предупреждения о неинициализации p

Компиляция этого фрагмента кода с помощью gcc (4.5) и столько же -Wall, -Wextra, -Wuninitialized флаги типов, которые могут быть включены, не дает мне никаких предупреждений:

int main() {
    int *p = p;
    printf("p = %p\n", (void *)p);
    return 0;
}

Но запустив его несколько раз, вы получите следующий результат:

p = 0xbe9ff4
p = 0x550ff4
p = 0xeb1ff4
p = 0x4caff4

... и т.д.

Что здесь происходит?

EDIT: Компиляция с помощью "g++ -Wall" вместо этого дает мне предупреждение, как я ожидал:

In function ‘int main()’: warning: ‘p’ is used uninitialized in this function
4b9b3361

Ответ 1

int *p = p;

p определяется, как только анализируется int *p, но после этого RHS оценивается только. Это утверждение эквивалентно

int * p;
p = p;

В С++ это отличается от неявных конструкторов, но в простой ol C есть то, что у вас есть. Undefined начальное значение.

Что касается предупреждения о компиляторе, это проблема качества выполнения. gcc не "обманывается", он просто разрешительный.

Ответ 2

Valgrind дает предупреждения о неинициализации p. Я думаю, что gcc обманут и должен быть заполнен отчет об ошибке.