Для компиляции программ на Си GCC вам необходимо добавить флаг компилятора -Winit-self
.(Вам также нужно -Wall
или -Wuninitialized
, см. Ниже.) Для GCC, компилирующих программы на C ++, этот флаг подразумевается -Wall
, но для C он должен быть указан явно;он также не является частью -Wextra
.
Для Clang ситуация несколько интереснее.В фрагменте в OP Clang не производит никакой диагностики.Однако с помощью немного отличающегося фрагмента, представленного в руководстве GCC ниже, предоставляется диагностика:
int f() {
int i = i;
return i;
}
Разница в том, что в приведенном выше фрагменте фактически используется (неинициализированное) значение i
.По-видимому, в исходном коде Clang обнаружил, что переменная была бесполезна, и удалил ее как мертвый код перед применением диагностики.
В Clang диагностика запускается с помощью -Wuninitialized
, которая активируется -Wall
какв GCC.
Вот выдержка из руководства GCC:
-Winit-self
(только C, C ++, Objective-C и Objective-C ++)
Предупреждать о неинициализированных переменных, которые инициализируются сами по себе.Обратите внимание, что эту опцию можно использовать только с опцией -Wuninitialized
.
Например, GCC предупреждает о неинициализации i
в следующем фрагменте, только если было указано -Winit-self
:
int f()
{
int i = i;
return i;
}
Это предупреждение активируется -Wall
в C ++.
Как указывает выдержка, -Wuninitialized
также требуется.Как в C, так и в C ++ -Wall
означает -Wuninitialized
.Однако обратите внимание, что многие неинициализированные варианты использования не будут обнаружены, если не будет запрошен некоторый уровень оптимизации.(Насколько я знаю, это не относится к -Winit-self
. Его можно обнаружить без оптимизации.)
Раздражительно, когда вы отмечаете вопрос как дубликат, ранее отмеченные дубликатыисчезают.Я не пометил это, потому что ни один из дубликатов фактически не ответил на вопрос в теле;Я также отредактировал заголовок.
Для справки, вот оригинальные дубликаты, которые могут представлять интерес: