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

следующий файл 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 ответов


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

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

предупреждение 438 последнее значение переменной "символ" не используется -- значение имели присвоена переменной, которая впоследствии не использовалась. Этот сообщение выдается либо в инструкции return, либо в конце блок, когда переменная выходит из масштаб.


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