Wykrywanie martwego kodu w legacy C / C++ project [zamknięty]

Jak można przejść do wykrywania martwego kodu w kodzie C / C++? Mam dość dużą bazę kodu do pracy i co najmniej 10-15% to martwy kod. Czy istnieje jakieś narzędzie oparte na Uniksie do identyfikacji tych obszarów? Niektóre fragmenty kodu nadal używają dużo preprocesora, czy zautomatyzowany proces poradzi sobie z tym?

Author: Dror Helper, 2008-10-23

8 answers

Możesz użyć do tego narzędzia do analizy zasięgu kodu i szukać nieużywanych miejsc w kodzie.

Popularnym narzędziem dla GCC toolchain jest gcov, wraz z GRAFICZNYM interfejsem lcov (http://ltp.sourceforge.net/coverage/lcov.php).

Jeśli używasz gcc, możesz skompilować z obsługą gcov, która jest włączona przez flagę '--coverage'. Następnie uruchom aplikację lub uruchom pakiet testowy z tym gcov enabled build.

Zasadniczo gcc będzie emitować dodatkowe pliki podczas kompilacji i aplikacja będzie również emitować niektóre dane pokrycia podczas pracy. Musisz zebrać wszystkie te (.gcdo i .pliki gcda). Nie będę tutaj szczegółowo omawiać, ale prawdopodobnie musisz ustawić dwie zmienne środowiskowe, aby zbierać dane dotyczące zasięgu w rozsądny sposób: GCOV_PREFIX i GCOV_PREFIX_STRIP...

Po uruchomieniu, można umieścić wszystkie dane pokrycia razem i uruchomić go przez lcov toolsuite. Scalanie wszystkich plików coverage z różnych serii testowych jest również możliwe, choć trochę zaangażowane.

W każdym razie, kończysz z ładnym zestawem stron internetowych pokazujących pewne informacje o zasięgu, wskazując fragmenty kodu, które nie mają zasięgu, a co za tym idzie, nie były używane.

Oczywiście musisz dokładnie sprawdzić, czy części kodu nie są używane w żadnej sytuacji i wiele zależy od tego, jak dobre są Twoje testy. Ale przynajmniej, to da wyobrażenie o możliwych kandydatach martwych kodów...

 30
Author: Johan,
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
2008-10-23 09:38:59

Skompiluj go pod gcc za pomocą -wunreachable-code.

Myślę, że im nowsza wersja, tym lepsze wyniki uzyskasz, ale mogę się mylić w moim odczuciu, że jest to coś, nad czym aktywnie pracowali. Zauważ, że to robi analizę przepływu, ale nie wierzę, że mówi o "kodzie", który jest już martwy, zanim opuści preprocesor, ponieważ nigdy nie jest parsowany przez kompilator. Nie wykryje też np. wyeksportowanych funkcji, które nigdy nie są wywoływane, czy specjalnych kod obsługi przypadków, który tak się składa, że jest niemożliwy, ponieważ nic nigdy nie wywołuje funkcji z tym parametrem - potrzebujesz do tego pokrycia kodu (i uruchom testy funkcjonalne, Nie testy jednostkowe. Testy jednostkowe to przypuszcza się, że mają 100% pokrycie kodu, a więc wykonują ścieżki kodu, które są "martwe"w przypadku aplikacji). Mimo to, mając na uwadze te ograniczenia, jest to łatwy sposób na rozpoczęcie znajdowania najbardziej kompletnych procedur w kodzie baza.

Ten poradnik CERT zawiera listę innych narzędzi do wykrywania martwego kodu statycznego

 17
Author: Steve Jessop,
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-01-30 14:22:15

Twoje podejście zależy od dostępności (zautomatyzowanych) testów. Jeśli masz zestaw testów, który, jak ufasz, pokryje wystarczającą ilość funkcji, możesz użyć analizy pokrycia, zgodnie z wcześniejszymi odpowiedziami.

Jeśli nie masz tyle szczęścia, warto zajrzeć do narzędzi do analizy kodu źródłowego, takich jak SciTools ' zrozum, że mogą Ci pomóc w analizie kodu za pomocą wielu wbudowanych raportów analitycznych. Moje doświadczenie z tym narzędziem pochodzi z 2 lat temu, więc ja nie mogę podać wiele szczegółów, ale pamiętam, że mieli imponujące wsparcie z bardzo szybkim czasem realizacji poprawek błędów i odpowiedzi na pytania.

Znalazłem stronę statyczna analiza kodu źródłowego , która zawiera również wiele innych narzędzi.

Jeśli to nie pomoże ci wystarczająco, a jesteś szczególnie zainteresowany znalezieniem martwego kodu związanego z preprocesorem, polecam zamieścić więcej szczegółów na temat kodu. Na przykład, jeśli jest to głównie związane z różnymi kombinacjami ustawień # ifdef można pisać skrypty, aby określić (kombinacje) ustawień i dowiedzieć się, które kombinacje nigdy nie są rzeczywiście zbudowane, itp.

 4
Author: andreas buykx,
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
2008-10-23 14:54:05

G++ 4.01-wunreachable-code ostrzega o kodzie, który jest nieosiągalny w funkcji, ale nie ostrzega o nieużywanych funkcjach.

int foo() { 
    return 21; // point a
}

int bar() {
  int a = 7;
  return a;
  a += 9;  // point b
  return a;
}

int main(int, char **) {
    return bar();
}

G++ 4.01 wyświetli ostrzeżenie o punkcie b, ale nie mów nic o Foo () (punkt a), nawet jeśli jest nieosiągalny w tym pliku. To zachowanie jest poprawne, chociaż rozczarowujące, ponieważ kompilator nie może wiedzieć, że funkcja foo () nie jest zadeklarowana extern w innej jednostce kompilacji i wywoływana stamtąd; tylko linker może być pewien.

 4
Author: Thomas L Holaday,
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
2009-02-18 21:41:23

Tylko dla kodu C i zakładając, że kod źródłowy całego projektu jest dostępny, Uruchom analizę za pomocą narzędzia Open Source Frama-C . Każda instrukcja programu, która wyświetla na Czerwono w GUI jest martwy kod.

Jeśli masz problemy z "martwym kodem", możesz być również zainteresowany usunięcie "kodu zapasowego", kodu, który jest wykonywany, ale nie przyczynić się do efektu końcowego. Wymaga to podania dokładne modelowanie funkcji We/Wy (nie chciałbyś aby usunąć obliczenia, które wydają się być" zapasowe", ale to jest używane jako argument printf). Frama-C posiada opcję Wskazywania kodu zapasowego.

 4
Author: Pascal Cuoq,
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
2014-01-24 12:35:56

Zarówno Mozilla jak i Open Office mają domowe rozwiązania.

 4
Author: Max Lybbert,
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-04-17 05:18:57

Taka analiza Martwego kodu wymaga globalnej analizy całego projektu. Nie można uzyskać tych informacji, analizując jednostki tłumaczeniowe indywidualnie (cóż, można wykryć martwe jednostki, jeśli są one całkowicie w obrębie jednej jednostki tłumaczeniowej, ale nie sądzę, że to jest to, czego naprawdę szukasz).

Użyliśmy naszego DMS Software Reengineering Toolkit, aby zaimplementować dokładnie to dla kodu Java, analizując wszystkie jednostki kompilacji zaangażowane na raz, tworząc tabele symboli dla wszystko i szukanie wszystkich referencji. Definicja najwyższego poziomu bez odniesień i bez twierdzenia, że jest zewnętrznym elementem API jest martwa. To narzędzie automatycznie usuwa martwy kod, a na końcu możesz wybrać, co chcesz: raport martwych podmiotów lub kod pozbawiony tych podmiotów.

DMS również parsuje C++ w różnych dialektach (edycja Luty 2014: w tym wersje MS i GCC C++14 [edycja Listopad 2017: Teraz C++17]) i buduje wszystkie niezbędne symbole stoły. Od tego momentu znalezienie martwych odniesień byłoby proste. DMS może być również używany do ich rozebrania. Zobacz http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html

 3
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
2017-11-01 16:08:16

Byk Narzędzie pokrycia pomogłoby. Nie jest to jednak bezpłatne.

 1
Author: Ashwin,
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
2008-10-23 09:23:23