2012-01-18 9 views
6

Należy odpowiedzieć na pytanie: g++ does not show a 'unused' warning.Znajdowanie nieużywanych obiektów (wartości inne niż pierwotne)

W pełni rozumiem, dlaczego g ++ nie ostrzega o tych zmiennych, ale chciałbym go jakoś je znaleźć. Kod, nad którym pracuję, nie ma żadnego z tych specjalnych przypadków, więc pojedynczy FloatArray x; jest prawie na pewno pozostawiony.

Nawet jeśli muszę oznaczyć poszczególne klasy (takie jak ostrzeżenie o nieużywanych obiektach FloatArray), byłoby to bardzo przydatne. Co mogę zrobić?

+0

Czy to naprawdę problem? Trudno to sobie wyobrazić, ponieważ większość kompilatorów prawdopodobnie wbuduje obiekty w nicość, a potem ich nie użyje, prawda? –

+0

Jednak kompilatory ostrzegają o tym, gdy stwierdzą, że zmienna nie jest używana "przed optymalizacją", a nie po. To byłby koszmar! – rodrigo

Odpowiedz

1

Cóż, zasadniczo chcesz stworzyć proste narzędzie do analizy statycznej podłączone do GCC? Jeśli tak, możesz zacząć od użycia MELT, aby szybko zaimplementować nieużywaną drukarkę zmienną.

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

+0

Dzięki, ale nie jestem pewien "szybko". Nie spełniam wymienionych warunków wstępnych (nawet nie jest blisko, można by rzec). Postaram się sprawdzić, czy mogę już znaleźć kogoś, kto zrobił to w MELT. –

-1

Nie jestem pewien, czy ja czegoś brakuje w pytaniu ale gcc/g ++ posiada opcje, które pozwalają określić, które ostrzeżenia chcesz i czego nie robić. Po prostu włącz opcję -Wunused-variable.

Zobacz tutaj po więcej szczegółów: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Również -Wall zmieni to i wiele innych przydatnych ostrzeżenie na.

+2

Ostrzeżenie o nieużywanej zmiennej działa tylko dla klas pierwotnych, a nie dla C++, ponieważ konstruktor/destruktor może mieć pożądany efekt. – greg

+1

Przepraszam, ale -1 ponieważ faktycznie link do pytania, które wyjaśnia, dlaczego to nie zadziała. –

+0

wystarczająco fair. Pewnego dnia nauczę się czytać. – Liam

3

Cóż, z GCC poniższy kod ma ostrzec, jak chcesz:

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

Ale jeśli dodać konstruktora/destruktora do Foo lub bar struktury, a nawet trywialne jeden, to nie będzie ostrzec.

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

więc najprostszym sposobem na odzyskanie ostrzeżenie jest kompilacja wszystkich istotnych konstruktorów i destruktorów warunkowo:

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

Teraz skompilować z g++ -DTEST_UNUSED celu sprawdzenia dodatkowych zmiennych nieużywanych.

Nie mój najjaśniejszy pomysł, ale działa.

+2

Może to działać dla obiektów tworzonych przez użytkowników, ale nie dla tych, które są dostarczane przez język (łańcuch, kontenery STL itp.). – greg

+0

To prawdopodobnie pozwoli mi znaleźć znaczną ilość nieużywanych obiektów w projekcie, więc pozwolę ci zdobyć nagrodę. –

Powiązane problemy