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