gcc не предупреждает «переменная установлена, но не используется»

У меня есть этот 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++;
}

Здесь я бы ожидал эти две ошибки:

  1. error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable],
  2. 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], Все остальные уровни оптимизации не выдают никаких предупреждений.

1

Решение

Переменные не используются для компилятора. Это предупреждение срабатывает только в том случае, если вы объявляете локальную переменную (и в конечном итоге инициализируете ее), но затем никогда не используете эту переменную в каком-либо утверждении.

Итак, в ваших примерах переменная unused объявляется, инициализируется (в первом примере) и используется во 2-м операторе (здесь для чтения и записи). Переменная x также объявляется и используется (но не инициализируется).

Во втором примере компилятор должен показывать «неинициализированное» предупреждение для переменной x, Это может быть ошибка компилятора, если это предупреждение отображается для -O1 только?

2

Другие решения

Это ошибка 5 с половиной лет.

Смотрите GCC Bugzilla — Ошибка 44677

0

По вопросам рекламы [email protected]