Как получить предупреждения о переменных, присвоенных, но больше не используемых?

Следующий файл 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. Есть ли причина для такого поведения? То есть, в некоторых случаях действительно желательно присваивать локальные переменные, которые будут отброшены оптимизатором?
9
задан adl 5 January 2012 в 16:54
поделиться