El siguiente archivo foo.c
es una versión simplificada de un error más sutil que encontré en mi código.¿Cómo obtener advertencias sobre las variables asignadas, pero que ya no se usan?
int b;
void bar(int a);
void foo(int a)
{
bar(a);
a = 42;
}
La línea a = 42
es, de hecho, un error en mi código: Me refería b = 42
. No espero que el compilador detecte que cometí un error tipográfico, pero me gustaría recibir una advertencia que estoy asignando a una variable local (o un parámetro de función) que ya no se usará. Si compilo este archivo con
% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c
No tengo absolutamente ninguna advertencia. La inspección del código generado muestra que la asignación a = 42
no se realiza, por lo que gcc
es perfectamente consciente de que esta instrucción es inútil (por lo tanto, potencialmente falsa). Comentando la llamada al bar(a);
produce una advertencia warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter]
, por lo que parece que gcc
no avisará mientras se use a
en algún lugar de la función, incluso si es antes de la asignación.
Mis preguntas:
- ¿Hay una manera de contar GCC o Sonido metálico para producir una advertencia para tal caso? (No pude obtener clang 3.0 para producir ninguna advertencia, incluso con la llamada a
bar
eliminado.) - ¿Hay alguna razón para el comportamiento real? Es decir, ¿en algunos casos fue realmente deseable asignar a variables locales que el optimizador desechará?
hacer el argumento de la función de un 'const' y el compilador se quejará:' void foo (const int a) {/ * ... lo que sea ... * /} ' – pmg
@pmg: Cambio de la fuente no es una opción: quiero detectar asignaciones inútiles similares en mi base de código existente. – adl
@pmg jeje, bueno;) – ouah