Действительно ли это 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
Ответы
Ответ 1
int *p = p;
p
определяется, как только анализируется int *p
, но после этого RHS оценивается только. Это утверждение эквивалентно
int * p;
p = p;
В С++ это отличается от неявных конструкторов, но в простой ol C есть то, что у вас есть. Undefined начальное значение.
Что касается предупреждения о компиляторе, это проблема качества выполнения. gcc не "обманывается", он просто разрешительный.
Ответ 2
Valgrind дает предупреждения о неинициализации p. Я думаю, что gcc обманут и должен быть заполнен отчет об ошибке.