2012-01-05 14 views
9

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:

  1. ¿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.)
  2. ¿Hay alguna razón para el comportamiento real? Es decir, ¿en algunos casos fue realmente deseable asignar a variables locales que el optimizador desechará?
+1

hacer el argumento de la función de un 'const' y el compilador se quejará:' ​​void foo (const int a) {/ * ... lo que sea ... * /} ' – pmg

+0

@pmg: Cambio de la fuente no es una opción: quiero detectar asignaciones inútiles similares en mi base de código existente. – adl

+0

@pmg jeje, bueno;) – ouah

Respuesta

4

No hay ninguna opción de gcc o clang que yo sepa que puede advertir sobre esta inútil tarea.

PC-Lint por otro lado es capaz de advertir en esta situación.

Advertencia 438 del último valor asignado a la variable 'Símbolo' no se utiliza - Un valor había sido asignado a una variable que no fue utilizada posteriormente. El mensaje se emite en una declaración de devolución o al final de un bloque cuando la variable queda fuera del alcance.

-1

El compilador detectará que se trata de un código muerto y lo optimizará de todos modos. Si observa la lista de ensambles (siempre que le indique a gcc que optimice), entonces verá que la asignación no existe.

+0

Como mencioné en la pregunta original, ya le dije a 'gcc' que optimice, y ya he notado que la tarea se optimizó. La pregunta es por qué el compilador no me va a decir que escribí algo inútil, o cómo puedo configurarlo para que me lo haga saber. – adl

+0

No estás respondiendo la pregunta. Él quiere que el compilador detecte dicho código, cuando el programador no se dio cuenta del error (y por lo tanto no profundizará en los archivos de la lista). – ugoren

Cuestiones relacionadas