2013-05-14 18 views
12

Ich musste einige Projekte anpassen, die für einen anderen Zweck geschrieben wurden, aber einige Kernfunktionen sind für mein Projekt gleich und funktionieren wie es ist. Aber es gibt viele Variablen, Makros, Funktionen usw., die für meinen aktuellen Kontext nicht nützlich sind und sie machen den Code nur sehr unruhig zu lesen und unnötig groß.Gibt es ein Werkzeug/Weg, um alle unbenutzten Variablen, Makros, Header (Includes) und Funktionen aus C++ Code zu erkennen/zu entfernen?

Also habe ich angefangen, die Variablen Makros Funktionen etc .. zu entfernen, indem Sie "Finde Referenzen" und "Call Graph" in Netbeans. Ich benutze Netbeans Remote-Entwicklungstools für C/C++. Aber es ist umständlich. Also, gibt es irgendein Werkzeug, um dies aufzuräumen?

+1

Vielleicht der [Clang Static Analyzer] (http://clang-analyzer.llvm.org/) für die semantische Analyse? –

+0

Tatsächlich warnt clang selbst während der normalen Kompilierung nicht verwendete Variablen und Funktionen. – ltjax

+1

Das ist schwieriger als es scheint. Woher weißt du, ob ein #include ungenutzt ist? Ich meine, Sie können etwas wie eine #define haben, die 'malloc()' auf 'malloc_dbg()' dort einbaut und dann sowohl mit als auch ohne diese Datei kompiliert, ändert sich nur das Verhalten. – sharptooth

Antwort

9

Von dem, was ich weiß, gibt es derzeit kein Werkzeug, das alle Dinge tut Sie erwähnt haben, jedoch ist es eine, die die nicht verwendete enthalten Header bei der Säuberung hilft: include-what-you-use

"Fügen Sie, was Sie verwenden "bedeutet dies: für jedes Symbol (Typ, Funktion Variable oder Makro), die Sie in foo.cc verwenden, sollte entweder ### foo.cc oder foo.h # eine .h-Datei enthalten, die die Deklaration dieses Symbols exportiert. Das include-what-you-use-Tool ist ein Programm, das mit den clang-Bibliotheken erstellt werden kann, um #includes von Quelldateien zu analysieren, um include-what-you-use-Verstöße zu finden und Korrekturen für sie vorzuschlagen.

Das Hauptziel von include-what-you-use ist die Entfernung überflüssiger #includes. Dies geschieht, indem Sie herausfinden, welche # includes für diese Datei (für .cc- und .h-Dateien) nicht benötigt werden, und ersetzt # includes mit forward-deklariert, wenn möglich.

Man könnte erwarten, dass die Clang static analyzer dies tun würde, aber von dem, was ich sehe, the availalbe checks bieten keine solche Dinge.

Dies könnte eine gute Zeit für jemanden suggest a feature request an den Analysator sein oder ein separates Werkzeug mit den bei Clang Tools

In der Zwischenzeit beschriebenen Tools LibTooling auf einem ähnlichen Niveau erstellen, würde ich Sie ermöglichen vorschlagen - Wand und -Wextra Compiler-Flags, die die folgenden Warnungen auslösen (unter anderem) (siehe die GCC-Dokumentation unten):

  • -Wunused-Funktion
  • -Wunused-label
  • -Wunused-Wert
  • -Wunused variable
  • -Wunused-Parameter
  • -Wunused-but-Set-Parameter

Wenn für Irgendein Grund, warum du das nicht willst, du könntest einfach -Wunused hinzufügen, was nur die oben genannten -Verwendeten Optionen kombiniert, ohne die anderen Flags, die -Wall oder -Wextra hinzufügen.

Um aber eine Warnung über einen nicht verwendeten Funktionsparameter zu bekommen, Sie müssen entweder angeben -Wextra -Wunused (beachten Sie, dass -Wall -Wunused impliziert) oder separat -Wunused-Parameter angeben.

Natürlich bedeutet dies, dass Sie die Bereinigung zu tun haben, manuell

Wenn Sie möchten, dass Sie zusätzliche pedantisch sein könnte genauso gut alle Warnungen in Fehler umwandeln, indem Sie die -pedantic Fehler Flagge

Für weitere Details lesen Sie die GCC Warnings Options documentation.

2

Ich habe manchmal verwendet, das Verfahren zur Herstellung eines großen Blockes von Codemarkierung als „nicht verwendet“ durch

Zugabe
#if 0 
    ... lots of code 
#endif 

Sie können dann den Code kompilieren und sehen, was schief geht. Analysieren Sie die "undeclared varibale X" -Fehler, die Sie erhalten, und setzen Sie die dafür notwendigen Bits wieder ein. Sie können dies tun, indem Sie entweder den Block #if 0 "zerschneiden" (einen #endif hinzufügen, dann einen neuen #if 0 etwas weiter unten), oder indem Sie die Teile, die Sie benötigen, aus dem aktuellen Block entfernen.

Zum Beispiel, wenn Sie einen Block von globalen Variablen oder Makros haben, setzen Sie einfach #if 0 um alle von ihnen, und sehen Sie, welche tatsächlich verwendet werden. [Obwohl Makros ein wenig komplizierter sein können, wenn sie in #ifdef und so verwendet werden].

Ich wäre überrascht, wenn da draußen kein Werkzeug gibt es, aber zugleich, Sie immer noch die Schneidarbeit zu tun haben, und wenn man einen großen Teil des Codes in #if 0 ... #endif haben, ist es ziemlich einfach zu schneide es aus.

+0

Ich kann es manuell machen und ich mache es gerade. Aber ich fragte nach dem Tool, um die Quelle automatisch zu analysieren und mir die zu entfernenden Dinge zu zeigen. ZB: In Eclipse oder Netbeans für Java, IDE zeigt ungenutzte Variable oder nicht verwendeten Import etc .. – Sreekar

+0

die '#if 0' ist nicht sehr sicher aufgrund der Namenssuche - z. Wenn ein Header mit '#if 0' gelöscht wurde, kann der Compiler einfach eine Funktion (die aufgerufen wird) verwenden, wobei diese Funktion auch in einem äußeren Gültigkeitsbereich deklariert wird.Da die meisten Benutzer Bereiche nicht explizit qualifizieren, hat der Ansatz das Potenzial, Bugs im Zusammenhang mit der Namenssuche ohne Warnung einzuführen. – justin

0

Viele statische Codeanalysewerkzeuge liefern die gewünschten Informationen. Wikipedia has a list. Wir haben erfolgreich such a tool (mit einigen benutzerdefinierten Änderungen) verwendet, um Includes zu entfernen und die Kompilierzeit zu beschleunigen.