Ответ 1
Действительно, это известная проблема в gcc.
gcc печально известен как неверные неинициализированные переменные.
Недостатки были отмечены должным образом, и есть инициатива по преодолению недостатков:
Лучше неинициализированные предупреждения:
Сборник компиляторов GNU предупреждает об использовании неинициализированных переменных с опцией
-Wuninitialized
. Однако в нынешней реализации есть некоторые предполагаемые недостатки. С одной стороны, некоторые пользователи хотели бы получить более подробные и последовательные предупреждения. С другой стороны, некоторые пользователи хотели бы получить как можно меньше предупреждений. Цель этого проекта - реализовать обе возможности и в то же время улучшить существующие возможности.
Инициатива направлена на предоставление более эффективных предупреждений, и она приводит пример примера, подобный вашему делу. Соответствующей частью является:
То, что пользователь понимает как ложный, может отличаться для конкретного пользователя. Некоторые пользователи заинтересованы в случаях, которые скрыты из-за действий оптимизаторов в сочетании с текущей средой. Однако многих пользователей нет, поскольку этот случай скрыт, потому что он не может возникнуть в скомпилированном коде. Канонический пример
int x;
if (f ())
x = 3;
return x;
где 'f' всегда возвращает ненулевое значение для текущей среды и, следовательно, может быть оптимизировано. Здесь группа пользователей хотела бы получить неинициализированное предупреждение, так как "f" может возвращать ноль при компиляции в другом месте. Тем не менее, другая группа пользователей рассмотрит ложное предупреждение о ситуации, которая не может возникнуть в компиляции исполняемого файла.