Как получить предупреждения о переменных, назначенных, но не используемых больше? - PullRequest
9 голосов
/ 05 января 2012

Следующий файл foo.c представляет собой упрощенную версию более тонкой ошибки, которую я нашел в своем коде.

int b;

void bar(int a);

void foo(int a)
{
  bar(a);
  a = 42;
}

Строка a = 42 на самом деле является опечаткой в ​​моем коде: я имел в виду b = 42.Я не ожидаю, что компилятор обнаружит, что я сделал опечатку, но я хотел бы получить предупреждение, которое я назначаю локальной переменной (или параметру функции), которая больше не будет использоваться.Если я скомпилирую этот файл с

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c

, я не получу абсолютно никакого предупреждения.Проверка сгенерированного кода показывает, что присвоение a = 42 не выполняется, поэтому gcc прекрасно понимает, что эта инструкция бесполезна (следовательно, потенциально фальшивая).Комментирование вызова bar(a); действительно выдает предупреждение warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter], поэтому кажется, что gcc не будет предупреждать, пока где-то в функции используется a, даже если это до назначение.

Мои вопросы:

  1. Есть ли способ сообщить GCC или Clang выдать предупреждение для такого случая?(Я не смог заставить clang 3.0 выдавать какие-либо предупреждения, даже с удаленным вызовом bar.)
  2. Есть ли причина для такого поведения?Т.е. в каких случаях было бы желательно назначить локальные переменные, которые будут выбрасываться оптимизатором?

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Насколько мне известно, нет опции gcc или clang, которая могла бы предупредить об этом бесполезном назначении.

PC-Lint, с другой стороны, может предупреждать в этой ситуации.

Предупреждение 438 Последнее значение, присвоенное переменной «Символ», не используется - Значение имело был назначен переменной, которая впоследствии не использовалась. сообщение выдается либо в заявлении о возврате, либо в конце блок, когда переменная выходит из области видимости.

0 голосов
/ 05 января 2012

Компилятор обнаружит, что это мертвый код, и все равно оптимизирует его. Если вы посмотрите на список сборок (если вы скажете gcc оптимизировать), вы обнаружите, что назначение отсутствует.

...