2008-11-26 12 views
51

Ich habe ein großes veraltetes C++ Projekt, das unter Visual Studio 2008 kompiliert wurde. Ich weiß, dass es ziemlich viel 'toten' Code gibt, auf den nicht zugegriffen wird - Methoden, die nicht aufgerufen werden werden nicht benutzt.Dead code identification (C++)

Ich bin auf der Suche nach einem Tool, das dies durch statische Analyse identifizieren wird.

Diese Frage: Dead code detection in legacy C/C++ project schlägt vor, Code Coverage Tools zu verwenden. Dies ist keine Option, da die Testabdeckung gerade nicht hoch genug ist.

Es erwähnt auch einen -Wunreachable-Code. Option zu gcc. Ich möchte etwas ähnliches für Visual Studio. Wir verwenden bereits die Option/OPT: REF des Linkers, um redundanten Code zu entfernen, aber dies meldet den toten Code nicht auf einer nützlichen Ebene (bei Verwendung mit/VERBOSE gibt es mehr als 100.000 Zeilen, einschließlich einer Menge aus Bibliotheken).

Gibt es bessere Optionen, die gut mit einem Visual Studio-Projekt funktionieren?

+0

Sehr interessiert an Antworten zu hören, aber ich habe nichts anderes zu tun als einen upvote. :) –

+0

Ich fragte mich genau anders neulich. – Coincoin

+0

Ich auch. Klingt nach einer Geschäftsmöglichkeit ... – NotMe

Antwort

6

Sie wollen etwas in Richtung 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.

Sie suchen nach einem statischen Codeanalyse-Tool, das nicht erreichbaren Code erkennt; Viele Kodierungsrichtlinien (wie MISRA-C++, wenn ich mich nicht irre) erfordern, dass kein unerreichbarer Code existiert. Ein Analysetool, das speziell auf die Durchsetzung einer solchen Richtlinie ausgerichtet ist, wäre die beste Wahl.

Und Sie werden auch in der Lage sein, andere Verwendungen für das Werkzeug zu finden.

3

Ich kenne Visual C nicht, und hatte auch die -Wunreachable-Code spezifische Coverage-Tools empfohlen. Als Lösung für Ihre Situation versuchen würde ich folgendes:

  1. mit ctags Stellen (oder ein ähnliches Programm), um eine Liste aller Symbole in Ihrer Quelle
  2. in Ihrem Compiler Aktivieren Sie die Beseitigung von totem Code (ich würde es annehmen (standardmäßig aktiviert)
  3. Aktivieren Sie Ihre gesamten Programm-/Verbindungszeit-Optimierungen (damit er weiß, dass nicht verwendete Funktionen in Ihren Modulen nicht von anderen externen Quellen benötigt werden und verworfen werden)
  4. Nimm die Symbole aus deiner Binärdatei und vergleiche sie mit die Symbole von 1.

Ein anderer Ansatz könnte ein Aufrufgraph-Erzeugungswerkzeug sein (z. Doxygen).

0

Ein Ansatz, der für mich funktioniert - mit Delphi - ist das Debugging zu aktivieren, und führen Sie Ihr Programm unter dem Debugger.

Wenn ein Delphi-Programm unter dem Debugger ausgeführt wird, zeigt die IDE am Rand an, welche Zeilen des Codes als Haltepunkte gesetzt werden können. Code, der wirklich tot ist - d. H. Durch den Linker/Compiler ausgezogen wurde, ist offensichtlich, da dort keine Breakpoints gesetzt werden können.

Einige zusätzliche Hinweise, wie commen dies falsch zu verstehen scheinen:

a: Sie müssen nicht versuchen, in jeder Zeile einen Haltepunkt zu setzen. Öffnen Sie einfach die Quelldatei in der IDE und scrollen Sie schnell durch sie. Dead Code ist leicht zu erkennen.

b: Dies ist KEINE Überprüfung der Codeabdeckung. Sie müssen die Anwendung nicht ausführen, um zu sehen, ob sie die Zeilen erreicht.

c: Ich bin nicht genug vertraut VS2008 so kann nicht sagen, ob dieser Vorschlag funktioniert.

+0

Coole Idee! VS erlaubt keine Breakpoints auf diese Weise in einem Release-Build ... aber ich denke nicht, dass es die betroffenen Zeilen visuell hervorhebt. Sie können sich die Ansicht "Gemischte Baugruppe/Quelle" ansehen, um zu sehen, welche Zeilen keine Baugruppe haben. –

+0

VS würde keine Haltepunkte im Code zulassen, der nicht "tot" ist, sondern mit Makros deaktiviert wurde. So kann man am Ende einige Makros brechen, indem man den scheinbar toten Code entfernt. Das ist gefährlich! –

+0

@Ignas: Und wie, genau, geht jeder Ansatz mit diesem Problem umgehen? – Roddy

-2

Schreiben Sie ein Skript, das zufällig eine Funktion löscht (aus dem Quellcode) und alles von Grund auf neu kompiliert. Wenn es noch kompiliert - diese Funktion war toter Code.

+8

Dies wird nicht funktionieren. Was ist, wenn es eine Kette von 3 verwandten Funktionen gibt, einen Code "cul-de-sac". Das Entfernen einer der Funktionen führt dazu, dass der Kompiliervorgang abgebrochen wird, obwohl der Satz insgesamt tot ist. – Cheeso

+0

Wird in einigen Szenarien funktionieren, und ich denke, es ist eine großartige Idee. – tmighty

8

Ich weiß, dass Gimpel's Lint Produkte (PC-Lint und Flexelint) nicht erreichbaren Code und nicht verwendete/nicht referenzierte Module identifizieren.

Sie fallen beide in die Kategorie der statischen Analysewerkzeuge.

Ich habe keine Verbindung mit Gimpel, nur ein zufriedener Langzeit-Kunde.

0

Ich schlage vor, Sie verwenden ein paar Ansätze: 1. GCC einige nützliche Zusammenstellung Fahnen hat:

-Wunused-function 
-Wunused-label 
-Wunused-value 
-Wunused-variable 
-Wunused-parameter 
-Wunused-but-set-parameter 

2. cppcheck hat einige nützliche Funktionen wie:

--enable=unusedFunction 

3. Verwenden Sie statische Analysator wie zuvor angedeutet.