У меня есть этот MCVE, который компилируется без предупреждения:
auto foo() -> void
{
int unused = 0;
unused++;
}
Для меня я бы ожидал error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
,
Этот MCVE компилируется также без какого-либо предупреждения:
auto foo() -> void
{
int x;
int unused;
for ( ; x < 100; x++ ) unused++;
}
Здесь я бы ожидал эти две ошибки:
error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
,error: ‘unused’ and ‘x’ are used uninitialized [-Werror=uninitialized]
Добавление bar( unused );
выше for
силы петли gcc
отобразить предупреждение об использовании неинициализированной переменной.
Почему gcc 4.9.3
не жаловаться в любом из обоих MCVE?
Команда компиляции: g++ -O3 -c -Wall -Wextra -Werror -std=c++11 foo.cpp
Компилируя это с -O1
Я получил это предупреждение за строку с for
: error: ‘x’ may be used uninitialized in this function [-Wmaybe-uninitialized]
, Все остальные уровни оптимизации не выдают никаких предупреждений.
Переменные не используются для компилятора. Это предупреждение срабатывает только в том случае, если вы объявляете локальную переменную (и в конечном итоге инициализируете ее), но затем никогда не используете эту переменную в каком-либо утверждении.
Итак, в ваших примерах переменная unused
объявляется, инициализируется (в первом примере) и используется во 2-м операторе (здесь для чтения и записи). Переменная x
также объявляется и используется (но не инициализируется).
Во втором примере компилятор должен показывать «неинициализированное» предупреждение для переменной x
, Это может быть ошибка компилятора, если это предупреждение отображается для -O1
только?
Это ошибка 5 с половиной лет.