Как получить предупреждения о переменных, назначенных, но больше не используемых?
следующий файл 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
используется где-то в функции, даже если это до задание.
мои вопросы:
- есть ли способ сказать GCC или Clang, чтобы произвести предупреждение для такого случая? (Я не мог заставить clang 3.0 выдать какое-либо предупреждение, даже с вызовом
bar
удалены.) - есть ли причина для фактического поведения? То есть, в некоторых случаях было действительно желательно назначить локальные переменные, которые будут выброшены оптимизатором?
2 ответов
нет gcc
или clang
вариант, насколько мне известно, который может предупредить об этом бесполезном назначении.
PC-Lint
С другой стороны, может предупредить в этой ситуации.
предупреждение 438 последнее значение переменной "символ" не используется -- значение имели присвоена переменной, которая впоследствии не использовалась. Этот сообщение выдается либо в инструкции return, либо в конце блок, когда переменная выходит из масштаб.
компилятор обнаружит, что это мертвый код и оптимизирует его в любом случае. Если вы посмотрите на список сборок (при условии, что вы скажете gcc оптимизировать), то вы обнаружите, что назначение не существует.