Frage

Wie würden Sie tot Code-Erkennung gehen über in C / C ++ Code? Ich habe eine ziemlich große Code-Basis, mit zu arbeiten und mindestens 10-15% ist tot Code. Gibt es ein Unix-basiertes Tool, um diese Bereiche zu identifizieren? Einige Teile des Codes noch viel Präprozessor verwenden, kann automatisierter Prozess damit umgehen?

War es hilfreich?

Lösung

Sie können ein Code-Coverage-Analyse-Tool für diesen Einsatz und für nicht genutzte Stellen im Code suchen.

Ein beliebtes Werkzeug für den gcc-Toolchain ist gcov zusammen mit dem grafischen Frontend lcov ( http: / /ltp.sourceforge.net/coverage/lcov.php ).

Wenn Sie gcc verwenden, können Sie mit gcov Unterstützung kompilieren, die von der ‚--coverage‘ Flag aktiviert ist. Als nächstes Ihre Anwendung ausführen oder Ihre Testsuite mit diesem gcov aktiviert Build ausgeführt werden.

Im Grunde gcc wird einige zusätzliche Dateien während der Kompilierung emittieren und die Anwendung wird auch einige Abdeckungsdaten emittiert beim Laufen. Sie haben alle diese (.gcdo und .gcda-Dateien) zu sammeln. Ich werde nicht in allen Einzelheiten hier, aber Sie müssen wahrscheinlich zwei Umgebungsvariablen setzen, die Abdeckungsdaten in einer vernünftigen Art und Weise zu sammeln: GCOV_PREFIX und GCOV_PREFIX_STRIP ...

Nach dem Lauf können Sie alle Abdeckungsdaten zusammen und machen es durch die lcov Toolsuite laufen. Verschmelzen aller Berichterstattung Dateien von verschiedenen Testläufen ist auch möglich, wenn auch ein wenig beteiligt.

Wie auch immer, am Ende mit einem schönen Satz von Web-Seiten auf einige Berichterstattung Informationen zeigen, die Teile des Codes unter Hinweis darauf, dass keine Abdeckung haben und daher nicht verwendet wurden.

Aus Natürlich müssen Sie doppelt überprüfen, ob die Teile des Codes sind in jeder Situation nicht verwendet und hängt viel davon ab, wie gut Ihre Tests, um die Code-Basis auszuüben. Aber zumindest wird dies eine Vorstellung über möglichen dead-Code Kandidaten geben ...

Andere Tipps

Kompilieren unter gcc mit -Wunreachable-Code.

Ich denke, dass die neuere Version der, desto bessere Ergebnisse werden Sie erhalten, aber ich kann in meinem Eindruck falsch sein, dass es etwas, das sie haben auf arbeiten aktiv sind. Beachten Sie, dass diese Analyse nicht fließt, aber ich glaube nicht, es sagt Ihnen, über „Code“, die von der Zeit schon tot ist es den Präprozessor verlässt, weil das nie vom Compiler analysiert wird. Es wird auch nicht erkennen, z.B. exportierten Funktionen, die nie oder Sonderfall Behandlungs-Code, der nur so geschehen als unmöglich, weil nichts jemals ruft die Funktion mit dem Parameter genannt -. Sie Code-Coverage müssen, dass für (und die Funktionstests ausgeführt wird, nicht die Unit-Tests Unit-Tests sind sollte 100% Codeabdeckung haben und somit Codepfade auszuführen, die ‚tot‘ sind, soweit die Anwendung betrifft). Dennoch mit diesen Einschränkungen im Auge der meist völlig bollixed finden Routinen in der Code-Basis.

es ist eine einfache Möglichkeit, um loszuzulegen

Diese CERT listet einige andere Werkzeuge für die statische totem Code Erkennung

Ihr Ansatz ist abhängig von der Verfügbarkeit (automatisierten) Tests. Wenn Sie eine Testsuite haben, denen Sie vertrauen, eine ausreichende Menge an Funktionalität abzudecken, können Sie eine Coverage-Analyse verwenden, wie in früheren Antworten bereits vorgeschlagen.

Wenn Sie nicht so glücklich sind, können Sie in den Quellcode-Analyse-Tools aussehen wie SciTools ‘Verstehen Sie, dass Ihnen helfen, Ihren Code zu analysieren eine Menge mit der in Analyseberichten gebaut. Meine Erfahrung mit diesem Werkzeug stammt aus dem vor 2 Jahren, so kann ich Ihnen viel Detail nicht geben, aber was ich erinnere mich, dass sie eine beeindruckende Unterstützung mit sehr schnellen Durchlaufzeiten von Fehlerkorrekturen und Antworten auf Fragen hatten.

fand ich eine Seite auf statische Quellcodeanalyse , die auch viele andere Werkzeuge aufgelistet sind.

Wenn das Sie nicht in ausreichendem Maße entweder zu helfen, und Sie sind speziell daran interessiert herauszufinden, den Präprozessor bezogenen toten Code, würde ich empfehlen Sie einige weitere Details über den Code schreiben. Zum Beispiel, wenn es vor allem auf verschiedene Kombinationen von #ifdef Einstellungen zusammenhängt Sie Skripte schreiben, könnten die (Kombinationen von) Einstellungen zu ermitteln und herauszufinden, welche Kombinationen sind nie wirklich gebaut, etc.

g ++ 4.01 -Wunreachable-Code warnt vor Code, der innerhalb einer Funktion nicht erreichbar ist, aber über nicht genutzte Funktionen nicht warnen.

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 wird eine Warnung über Punkt b ausgeben, aber sagt nichts über foo () (Punkt a), obwohl es in dieser Datei nicht erreichbar ist. Dieses Verhalten ist korrekt, obwohl enttäuschend, weil ein Compiler nicht die Funktion foo wissen können () nicht extern in einer anderen Übersetzungseinheit deklariert und von dort aufgerufen; nur ein Linker kann sicher sein.

Für C-Code nur unter der Annahme, dass der Quellcode des gesamten Projektes verfügbar ist, starten Sie eine Analyse mit dem Open-Source-Tool Frama-C . Jede Aussage des Programms, das in der GUI rot anzeigt, ist toter Code.

Wenn Sie „dead code“ Probleme haben, können Sie auch daran interessiert sein Entfernen von „Ersatzcode“ Code, der ausgeführt wird, aber nicht Beitrag zum Endergebnis. Dies erfordert, dass Sie bieten eine genaue modelization von I / O-Funktionen (Sie würden nicht wollen, eine Berechnung zu entfernen, die „Reserve“ zu sein scheint, aber dass als Argument verwendet printf). Frama-C eine Option für den Hinweis auf Ersatzcode hat.

Sowohl Mozilla und Open Office home-grown-Lösungen haben.

Toter Code-Analyse, wie dies erfordert eine globale Analyse des gesamten Projektes. Sie können diese Informationen erhalten, indem Einheiten einzeln Übersetzung Analyse (na ja, können Sie tote Einheiten erkennen, wenn sie vollständig in einer einzigen Übersetzungseinheit sind, aber ich glaube nicht, dass das, was Sie wirklich suchen).

Wir haben unsere DMS Software Reengineering Toolkit verwenden genau dies für Java-Code zu implementieren, indem sie alles Kompilierung-Einheiten Parsen auf einmal beteiligt, Gebäudesymboltabellen für alles und die Jagd auf alle Referenzen. Eine Top-Level-Definition ohne Referenzen und kein Anspruch auf ein externes API Element zu sein, ist tot. Dieses Tool auch Streifen automatisch den toten Code aus, und am Ende können Sie wählen, was Sie wollen. Den Bericht von toten Einheiten oder den Code dieser Unternehmen abgezogen

DMS parst auch C ++ in einer Vielzahl von Dialekten (EDIT Februar 2014: einschließlich MS und GCC-Versionen ++ 14 C [EDIT November 2017: jetzt 17 C ++] ) und baut alle notwendigen Symboltabellen. Die Spur der toten Referenzen würde von diesem Punkt einfach sein. DMS kann auch sich Streifen aus verwendet werden. Siehe http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html

Bullseye Coverage Tool helfen würde. Es ist allerdings nicht frei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top