Dead-Code-Identifikation (C ++)
Ich habe ein großes legacy-C++ Projekt kompiliert unter Visual Studio 2008. Ich weiß, es ist eine halbwegs Menge von 'tot' - code, der nicht von überall zugänglich ist -- Methoden, die nicht aufgerufen werden, ganze Klassen, die nicht verwendet werden.
Ich bin auf der Suche nach einem tool, das identifizieren, das durch statische Analyse.
Diese Frage: Dead-code-Erkennung in legacy C/C++ - Projekt empfiehlt die Verwendung von code-coverage-tools. Dies ist nicht eine option, wie der test-Abdeckung ist einfach nicht hoch genug.
Es auch erwähnt -Wunreachable-code. option für gcc. Ich würde gerne etwas ähnliches für Visual Studio. Wir verwenden bereits den linker /OPT:REF-option entfernen redundanter code, das bedeutet aber nicht, berichten die dead code an einer geeigneten Ebene (bei Verwendung von /VERBOSE gibt es über 100.000 Zeilen, darunter eine Menge von Bibliotheken).
Gibt es bessere Optionen, die gut mit einem Visual Studio-Projekt?
InformationsquelleAutor der Frage Rob Walker | 2008-11-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie etwas entlang der Linien von QA-C++ (http://www.programmingresearch.com/QACPP_MAIN.html), siehe auch http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis für ähnliche Produkte.
Du suchst eine statische code-Analyse-tool, die erkennt, kann durch die unreachable code; viele coding-Richtlinien (z.B. MISRA-C++, wenn ich mich nicht Irre) verlangen, dass keine unreachable code vorhanden ist. Ein Analyse-tool richtet sich speziell an die Durchsetzung solcher Leitfaden würde Ihre beste Wette.
Und Sie werden in der Lage sein, andere Verwendungen zu finden für das Werkzeug als auch.
InformationsquelleAutor der Antwort
Ich weiß, dass Gimpel - Lint Produkte (PC-Lint und Flexelint) zu identifizieren, kann durch die unreachable code und unbenutzt /nicht referenzierte Module.
Beide fallen in die Kategorie der statischen Analyse-tools.
Habe ich keine Verbindung w/Gimpel, nur einen zufriedenen Kunden langfristig an sich.
InformationsquelleAutor der Antwort Dan
Ich weiß nicht, Visual C, und hatte auch empfohlen, die -Wunreachable-spezifischen code-coverage-tools. Als Lösung für deine situation würde ich Folgendes versuchen:
Ein anderer Ansatz könnte einige call-graph-Generierung Werkzeug (z.B. doxygen).
InformationsquelleAutor der Antwort flolo
Ich schlage vor, Sie verwenden ein paar Ansätze:
1. GCC hat ein paar nützliche Zusammenstellung flags:
2. Cppcheck hat einige nützliche Funktionen wie:
3. Verwendung der statischen Analyse wie schlagen vor.
InformationsquelleAutor der Antwort unresolved_external
Einen Ansatz, der für mich arbeitet - mit Delphi - ist um das debugging zu aktivieren, und führen Sie das Programm unter dem debugger.
Wenn Sie ein Delphi-Programm ausführen im debugger der IDE zeigt die Marge, die code-Zeilen als Haltepunkte. Code, der ist wirklich tot - also, wurde abgestreift vom linker/compiler ist offensichtlich als Haltepunkte können nicht eingestellt werden.
Einige zusätzliche Hinweise, wie Kommentatoren scheinen zu missverstehen:
a: Sie brauchen nicht zu versuchen Einstellung ein Haltepunkt in jeder Zeile. Öffnen Sie einfach die Quell-Datei in die IDE, und schnell Blättern Sie durch Sie. Dead code ist leicht zu erkennen.
b: Dies ist KEIN "code-coverage" prüfen. Sie nicht brauchen, um ausführen die Anwendung, um zu sehen, ob es reicht die Zeilen.
c: ich bin nicht vertraut genug, VS2008, so kann nicht sagen, ob dieser Vorschlag funktionieren wird.
InformationsquelleAutor der Antwort Roddy
Entweder
1) MSVC unter-eingesetzt in integrierten statische Analyse-tool.
2) Die MSVC Marktplatz hat viele Werkzeuge, einschließlich der Unterstützung für die meisten gratis-tools, einschließlich CppCheck
Benötigen Sie die neueste version von Visual Studio für die market-place-Anwendungen, aber das Kostenlose "Community Edition" hat sehr strenge Lizenzierung.
InformationsquelleAutor der Antwort Tiger4Hire
Schreiben Sie ein Skript, dass nach dem Zufallsprinzip löscht eine Funktion (aus dem source code) und kompiliert alles von Grund auf. Wenn es noch kompiliert - die Funktion war dead code.
InformationsquelleAutor der Antwort Krzysztof Kowalczyk