2012-01-18 11 views
6

Seguimiento de la pregunta: g++ does not show a 'unused' warning.Búsqueda de objetos no utilizados (valores no primitivos)

Entiendo completamente por qué g ++ no advierte sobre estas variables, pero me gustaría que de alguna manera las encuentre de todos modos. El código en el que estoy trabajando no tiene ninguno de esos casos especiales, por lo que un solo FloatArray x; es casi definitivamente sobrante.

Incluso si tengo que marcar clases individuales (como advertencia para objetos FloatArray no utilizados) sería muy útil. ¿Que puedo hacer?

+0

¿Es realmente un problema? Es difícil imaginar que así sea, ya que la mayoría de los compiladores probablemente alinearán los objetos a nada y luego no los usarán, ¿verdad? –

+0

Pero los compiladores advierten sobre esto cuando determinan que la variable no se usa "antes de la optimización", no después. ¡Eso sería una pesadilla! – rodrigo

Respuesta

1

Bueno, básicamente, ¿quieres crear algún tipo de herramienta de análisis estático simple conectado a GCC? Si es así, podría comenzar utilizando MELT para implementar rápidamente una impresora variable no utilizada.

http://gcc.gnu.org/wiki/MELT%20tutorial

+0

Gracias, pero no estoy seguro de "rápido". No cumplo con los requisitos previos enumerados (ni siquiera cerca, se podría decir). Trataré de ver si puedo encontrar a alguien que ya haya hecho esto en MELT. –

-1

No estoy seguro de si me falta algo en la pregunta, pero gcc/g ++ tiene opciones que le permiten especificar qué advertencias que quiere y lo que no lo hace. Así que simplemente habilité la variable -Wunused.

Vea aquí para más detalles: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Además, -Wall a su vez, esta advertencia y muchos más útil sucesivamente.

+2

La advertencia de variable no utilizada solo funciona para primitivas, no clases C++, porque el constructor/destructor podría tener un efecto deseado. – greg

+1

Lo siento, pero -1 ya que realmente me enlace a la pregunta que explica exactamente por qué esto no funcionará. –

+0

es suficiente. Un día, aprenderé a leer. – Liam

3

Bueno, con GCC el siguiente código advierte que desee:

struct Foo 
{ 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning: unused variable 'b' 
} 

Pero si se agrega un constructor/destructor a la Foo o estructura de bar, incluso trivial, no se advierten.

struct Foo 
{ 
    Foo() {} 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //no warning! It calls Foo::Foo() into b.f 
} 

Así que la forma más fácil de recuperar la advertencia es recopilar todos los constructores y destructores pertinentes condicional:

struct Foo 
{ 
#ifndef TEST_UNUSED 
    Foo() {} 
#endif 
}; 
struct Bar 
{ 
    Foo f; 
}; 
int main() 
{ 
    Bar b; //warning! 
} 

Ahora compila con g++ -DTEST_UNUSED para comprobar si las variables no utilizadas adicionales.

No es mi idea más brillante, pero funciona.

+2

Esto podría funcionar para objetos creados por el usuario, pero no para los provistos por el lenguaje (cadena, contenedores STL, etc.). – greg

+0

Esto probablemente me permita encontrar una cantidad significativa de los objetos no utilizados en el proyecto, así que le dejaré tener la recompensa. –

Cuestiones relacionadas