Это действительный C? Нет предупреждения о неинициализации p - PullRequest
12 голосов
/ 13 июля 2011

Компиляция этого фрагмента кода с 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

... и т. Д.

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

РЕДАКТИРОВАТЬ: Компиляция с "g ++ -Wall" вместо этого дает мне предупреждение, как я ожидал:

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

Ответы [ 2 ]

11 голосов
/ 13 июля 2011
int *p = p;

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

int * p;
p = p;

Это отличается в C ++ с неявными конструкторами, но в обычном старом C это то, что у вас есть. Неопределенное начальное значение.

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

2 голосов
/ 13 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...