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