2010-03-04 16 views
42

Ich arbeite gerade an einer großen und alten C++ - Anwendung, die viele Entwickler vor mir hatte. Es gibt eine Menge "toten Code" im Projekt, Klassen und Funktionen, die von niemandem mehr benutzt werden.Finden von "totem Code" in einer großen C++ Altanwendung

Welche Tools stehen für C++ zur Verfügung, um eine Analyse großer Code-Basis durchzuführen, um toten Code zu erkennen und zu refaktorieren? Hinweis: Ich spreche nicht über Testabdeckung Tool wie GCOV.

Wie finden Sie toten Code in Ihrem Projekt?

+2

Verwenden Sie irgendeine Art von Code-Coverage-Tool. Ich wollte 'gcov' vorschlagen, aber weiß nicht, was in VC verfügbar ist. –

+0

Wir haben Bullseye mit Erfolg verwendet. Hier ist ein Link für eine Testversion. http://www.bullseye.com/evaluation.html –

+0

Diese Frage hat eine großartige Lösung für gcc: [Gibt es eine Möglichkeit, GCC zu erhalten, um über nicht verwendete Funktionen zu warnen?] (http://stackoverflow.com/questions/9091397/is-there-away-to-get-gcc-zu-warnen-über-unbenutzte-Funktionen) –

Antwort

24

Sie erhalten eine statische Analyse Tool verwenden wollen

Der Haupt Gotcha Ich habe laufen In ist, dass Sie darauf achten müssen, dass keine Bibliotheken von irgendwo verwendet werden, dass Sie nicht c ontrol/haben. Wenn Sie eine Funktion aus einer Klasse löschen, die verwendet wird, indem Sie auf eine Bibliothek in Ihrem Projekt verweisen, können Sie etwas zerstören, von dem Sie nicht wussten, dass es den Code verwendet hat.

0

für toten Code nicht speziell Obwohl, fand ich die Quelle Navigator

http://sourcenav.berlios.de/

sehr nützlich, obwohl umständlich einzurichten und ein bisschen Buggy. Das war vor einem Jahr auf Linux (Fedora).

2

Ein Ansatz besteht darin, den Kontextmenübefehl "Alle Referenzen suchen" für Klassen- und Funktionsnamen zu verwenden. Wenn eine Klasse/Funktion nur in sich selbst referenziert wird, ist es fast sicher ein toter Code.

Ein anderer Ansatz, der auf der gleichen Idee basiert, ist das Entfernen (Auskommentieren) von Dateien/Funktionen aus dem Projekt und die Anzeige von Fehlermeldungen, die Sie erhalten.

+0

Dieser Ansatz ist definitiv ** nicht ** für große Projekte anwendbar. –

3

Ich denke, Ihre beste Wette wäre wahrscheinlich ein Coverage-Tool. Es gibt viel für beide * nix und Windows. Wenn Sie Komponententests haben, ist es einfach - wenn Sie eine geringe Testabdeckung haben, dann ist der aufgedeckte Code entweder tot oder noch nicht getestet (Sie wollen beide Teile dieser Information trotzdem). Wenn Sie keine Komponententests durchführen, erstellen Sie Ihre App mit der Instrumentierung, die von einem dieser Tools bereitgestellt wird, führen Sie sie durch einige (idealerweise alle) Ausführungspfade, und sehen Sie sich den Bericht an. Sie erhalten die gleichen Informationen wie bei Komponententests, es erfordert nur viel mehr Arbeit.

Da Sie Visual Studio verwenden, könnte ich Ihnen einige Links geben, die Sie verwenden in Erwägung ziehen könnte:

Keiner von ihnen ist frei, auch nicht billig , aber das Ergebnis ist es normalerweise wert.

auf * nichts-ähnlichen Plattformen gcov gekoppelt mit Werkzeugen wie zcov oder lcov ist eine wirklich gute Wahl.

2

Nichts ist besser als die Vertrautheit mit dem Code.Außer vielleicht strengem Beschneiden, wie man weitergeht.

Manchmal wird das, was aussieht wie Totholz, als Gerüst für Komponententests usw. verwendet, oder es scheint nur am Leben zu sein, weil Legacy Unit Tests es ausüben, aber es wird nie außerhalb der Tests ausgeführt. Vor Kurzem habe ich über 1000 LOC entfernt, was externe CAD-Modellübersetzer unterstützte, wir hatten Tests, die diese externen Übersetzer aufrufen, aber diese Übersetzer wurden für 8+ Jahre nicht unterstützt und es gab keinen Weg, einen Benutzer der Anwendung zu verwenden, selbst wenn er es wollte könnte sie jemals aufrufen.

Wenn man das tote Holz nicht rigoros beseitigt, findet man sein Team jahrelang bei der Wartung.

+0

Selbst wenn man den Weg beschneidet, rutschen die Dinge durch die Ritzen - es ist immer noch ein sehr nützlicher Fall, um weltweit toten Code zu finden. – ideasman42

0

Siehe unsere SD C++ Test Coverage.

Sie müssen eine Menge dynamischer Tests durchführen, um den Code auszuüben, um sicherzustellen, dass Sie die maximale Abdeckung erreichen. Code "nicht abgedeckt" kann oder kann nicht tot sein; vielleicht hattest du einfach keinen Testfall, um es auszuüben.

3

Caolán McNamara's callcatcher wird sehr effektiv innerhalb des LibreOffice-Projekts (~ 6 MLOC) verwendet, um toten Code zu finden.

4

können Sie Cppcheck für diesen Zweck verwenden:

$ 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. 
+0

Bitte posten Sie nicht die gleiche Antwort auf mehrere Fragen. Wenn die gleiche Information wirklich beide Fragen beantwortet, dann sollte eine Frage (normalerweise die neuere) als ein Duplikat der anderen geschlossen werden. Sie können dies angeben, indem Sie [wählen, um es als Duplikat zu schließen] (http://stackoverflow.com/help/privileges/close-questions) oder, wenn Sie nicht genügend Ansehen dafür haben, [have a flag] (http://stackoverflow.com/help/privileges/flag-posts) um anzuzeigen, dass es sich um ein Duplikat handelt. Andernfalls stellen Sie sicher, dass Sie Ihre Antwort auf * diese * Frage anpassen und nicht einfach dieselbe Antwort an mehreren Stellen einfügen. –

Verwandte Themen