Znalezienie "martwego kodu" w dużej aplikacji C++ legacy [zamknięty]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 4 lata temu .

Popraw to pytanie

Obecnie pracuję nad dużą i starą aplikacją C++, która miała wielu programistów przede mną. W projekcie jest dużo "martwego kodu", klas i funkcji, które nie są używane przez ktokolwiek.

Jakie narzędzia są dostępne dla C++, aby dokonać analizy dużej bazy kodu w celu wykrycia i refakturowania martwego kodu? Uwaga: nie mówię o narzędziu do testowania pokrycia, takim jak gcov.

Jak znaleźć martwy kod w swoim projekcie?

Author: DVK, 2010-03-04

8 answers

Będziesz chciał użyć narzędzia analiza statyczna

Najważniejsze jest to, że musisz uważać, aby żadne biblioteki nie były używane z miejsca, którego nie kontrolujesz/nie masz. Jeśli usuniesz funkcję z klasa, która zostanie użyta odwołując się do biblioteki w Twoim projekcie, możesz złamać coś, o czym nie wiedziałeś, używając kodu.

 28
Author: Alan Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:17

Możesz użyć Cppcheck w tym celu:

$ cppcheck --enable=unusedFunction .
Checking 2380153.c...
1/2 files checked 0% done
Checking main.c...
2/2 files checked 0% done
[2380153.c:1]: (style) The function '2380153' is never used.
 18
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 13:20:21

Caolán McNamara ' scallcatcher jest bardzo efektywnie wykorzystywany w projekcie LibreOffice (~6 MLOC) do znalezienia martwego kodu.

 4
Author: phw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-29 19:02:49

Myślę, że najlepszym rozwiązaniem byłoby narzędzie do pokrycia. Jest wiele zarówno dla *nix i windows. Jeśli masz testy jednostkowe, to jest to proste - jeśli masz niski zasięg testu, to kod jest albo martwy, albo jeszcze nie przetestowany(i tak chcesz oba kawałki tej informacji). Jeśli nie masz testów jednostkowych, zbuduj aplikację z oprzyrządowania dostarczonego przez jedno z tych narzędzi, przeprowadź ją przez niektóre (najlepiej wszystkie) ścieżki realizacji i zobacz Raport. Otrzymujesz te same informacje co w przypadku testów jednostkowych, będzie to wymagało tylko dużo więcej pracy.

Ponieważ używasz VisualStudio, mogę ci podać kilka linków, które możesz rozważyć:

Żaden z nich nie jest darmowy, nawet tani, ale wynik jest zwykle tego wart.

Na platformach podobnych do nix gcov w połączeniu z narzędziami takimi jak zcov lub lcov jest naprawdę świetnym wyborem.

 3
Author: Dmitry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 15:06:40

Jednym z sposobów jest użycie pozycji menu kontekstowego "Znajdź wszystkie referencje" w nazwach klas i funkcji. Jeśli do klasy/funkcji odwołuje się tylko sama w sobie, jest to prawie na pewno martwy kod.

Innym podejściem, opartym na tej samej idei, jest usuwanie (komentowanie) plików/funkcji z projektu i sprawdzanie, jakie komunikaty o błędach otrzymasz.

 2
Author: hongliang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 14:56:33

Nic nie przebije znajomości kodu. Może poza rygorystycznym przycinaniem.

Czasami to, co wygląda jak deadwood jest używane jako rusztowanie do testów jednostkowych itp., lub wydaje się być żywe po prostu dlatego, że starsze testy jednostkowe je wykonują, ale nigdy nie jest wykonywane poza testami. Jakiś czas temu usunąłem ponad 1000 LOC, które wspierało zewnętrznych tłumaczy modeli CAD, mieliśmy testy odwołujące się do tych zewnętrznych tłumaczy, ale te tłumaczy nie były wspierane przez 8 + lat i nie było sposobu, aby użytkownik aplikacji, nawet jeśli chciał, mógł je kiedykolwiek wywołać.

Jeśli ktoś nie jest surowy w pozbyciu się martwego drewna, znajdzie swój zespół utrzymujący rzeczy przez lata.

 2
Author: lilburne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 18:08:28

Zobacz nasz SD C++ test Coverage .

Musisz wykonać wiele testów dynamicznych, aby wykonać kod, aby upewnić się, że osiągniesz maksymalną ilość zasięgu. Kod "nie objęty" może być martwy lub nie; być może po prostu nie miałeś przypadku testowego, aby go wykonać.

 0
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 01:19:00

Chociaż nie specjalnie dla martwego kodu, znalazłem Source Navigator

Http://sourcenav.berlios.de/

Całkiem przydatne, choć kłopotliwe w konfiguracji i trochę buggy. To było rok temu na Linuksie (Fedora).

 -1
Author: Schwanritter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 14:54:03