2013-05-14 9 views
12

Musiałem dostosować niektóre projekty, które zostały napisane do jakiegoś innego celu, ale niektóre podstawowe funkcje są takie same dla mojego projektu i działają tak jak są. Ale istnieje wiele zmiennych, makr, funkcji itp., Które nie są przydatne w moim obecnym kontekście i po prostu powodują, że kod jest niepokojący i niepotrzebnie duży.Czy istnieje narzędzie/metoda do wykrywania/usuwania wszystkich nieużywanych zmiennych, makr, nagłówków (zawiera) i funkcji z kodu C++?

Zacząłem więc usuwać funkcje makr zmiennych itp., Używając "Znajdź odniesienia" i "Pokaż wykres połączeń" w Netbeans. Używam narzędzi do zdalnego programowania netbeans dla c/C++. Ale to nieporęczne. Czy jest jakieś narzędzie do czyszczenia?

+1

Może [analizator statyczny klang] (http://clang-analyzer.llvm.org/) do analizy semantycznej? –

+0

W rzeczywistości clang ostrzega o nieużywanych zmiennych i funkcjach nawet podczas normalnej kompilacji. – ltjax

+1

To jest trudniejsze, niż się wydaje. Skąd wiadomo, że #include nie jest używany? Mam na myśli, że możesz mieć coś w stylu #define, które odwzorowuje 'malloc()' na 'malloc_dbg()', a następnie kompiluje zarówno z tym plikiem, jak i bez niego, tylko zachowanie się zmienia. – sharptooth

Odpowiedz

9

Z tego co wiem, nie ma obecnie narzędziem, które ma wszystkie rzeczy, które zostały wymienione, jednak jest jeden, który pomaga w oczyszczaniu się niewykorzystana zawierać nagłówki: include-what-you-use

"Dołącz czego używasz "oznacza to: dla każdego symbolu (typ, funkcja zmienna lub makro), którego używasz w foo.cc, albo foo.cc, albo foo.h powinien # dołączyć plik .h, który eksportuje deklarację tego symbolu. Narzędzie typu "włóż to, co lubisz" jest programem, który można zbudować za pomocą bibliotek klang , w celu przeanalizowania # zawartych plików źródłowych w celu znalezienia naruszeń związanych z tym, czego używasz, i zaproponowania dla nich poprawek.

Głównym celem dołączania-co-używasz jest usuwanie zbędnych #includes. Robi to zarówno poprzez zorientowanie się, co #includes nie jest faktycznie potrzebne dla tego pliku (zarówno dla plików .cc, jak i .h), i zastępująC#includes z forward-deklaruje, kiedy to możliwe.

Można by oczekiwać, że Clang static analyzer by to zrobić, ale z tego co widzę the availalbe checks nie oferują takich rzeczy.

To może być dobry moment, aby ktoś suggest a feature request do analizatora lub utworzyć osobne narzędzie przy użyciu LibTooling na podobnym równi z narzędzi opisanych w Clang Tools

W międzyczasie sugeruję włączyć - ściana i -Wextra kompilatora flagi, która wywoła następujące ostrzeżenia (między innymi) (patrz docs GCC poniżej):

  • -Wunused funkcja
  • -Wunused-label
  • -Wunused wartość
  • -Wunused zmiennej
  • -Wunused parametr
  • -Wunused ale ustawiony parametr

Jeśli dla z jakiegoś powodu nie chcesz tego zrobić, możesz po prostu dodać -Wunused, który umożliwi łączenie tylko powyższych opcji Nieaktywnych, bez innych flag, które -Wall lub -Wextra dodaje.

Jednak aby dostać ostrzeżenie o nieużywanym parametr funkcji, należy albo podać -Wextra -Wunused (zauważ, że -Wall implikuje -Wunused) lub oddzielnie określić -Wunused parametr.

Oczywiście oznacza to, że trzeba zrobić porządki ręcznie

Jeśli chcesz mieć dodatkową pedantyczny równie dobrze można przekonwertować wszystkie ostrzeżenia w błędy poprzez dodanie -pedantic -errors flag

Aby uzyskać więcej informacji przeczytaj GCC Warnings Options documentation.

2

mam czasami stosowane metody oznaczania duży blok kodu jako „nieużywane” dodając

#if 0 
    ... lots of code 
#endif 

Następnie można skompilować kod i zobaczyć, co się dzieje źle. Przeanalizuj błędy "niezadeklarowanego varibalu X" i przywróć potrzebne do tego bity. Możesz to zrobić, albo "obcinając" blok #if 0 (dodając nieco później #endif, potem nowy #if 0), albo przesuwając potrzebne elementy z bieżącego bloku.

Na przykład, jeśli masz blok globalnych zmiennych lub makr, po prostu umieść #if 0 wokół nich i sprawdź, które z nich są używane. [Chociaż makra mogą być nieco trudniejsze, jeśli są używane w #ifdef i takich].

Byłbym zaskoczony, gdyby nie było tam narzędzia, ale w tym samym czasie nadal trzeba wykonać zadanie cięcia, a gdy już masz dużą porcję kodu w #if 0 ... #endif, łatwo jest wytnij to.

+0

Mogę to zrobić ręcznie i robię to obecnie. Ale pytałem o narzędzie do automatycznego analizowania źródła i pokazywania rzeczy do usunięcia. Na przykład: W środowisku Eclipse lub netbeans dla środowiska Java, IDE pokazuje nieużywaną zmienną lub nieużywany import itp. – Sreekar

+0

'# if 0' nie jest zbyt bezpieczny z powodu wyszukiwania nazw - np. jeśli nagłówek został wymazany za pomocą '#if 0', kompilator może po prostu użyć funkcji (która jest wywoływana), gdzie ta funkcja jest również zadeklarowana w zewnętrznym zasięgu.ponieważ większość osób nie kwalifikuje się wyraźnie do zakresów, podejście to może potencjalnie wprowadzić błędy związane z wyszukiwaniem nazw bez ostrzeżenia. – justin

0

Wiele narzędzi do statycznej analizy kodu dostarcza potrzebnych informacji. Wikipedia has a list. Pomyślnie użyliśmy such a tool (z pewnymi niestandardowymi zmianami), aby usunąć i przyspieszyć czas kompilacji.

Powiązane problemy