2014-03-24 15 views
5

Ich suche nach einer Möglichkeit zu überprüfen, ob mein C-Projekt, das zu einem ELF kompiliert, unbenutzte Funktionen hat, und suchen Sie sie. Das sind Funktionen, die deklariert sind, aber nirgends in meinem Code aufgerufen werden.Ermitteln von nicht verwendeten Funktionen in C

Die Lösung kann einer der folgenden sein:

  • Ein Dienstprogramm, das durch meine .c-Dateien geht, sie
  • Ein Dienstprogramm zu analysieren, die durch meine kompilierte ELF-Datei geht, die Symbole hat, ist es statisch
  • Analyse
  • Ein Weg, um nicht verwendete Funktionen in gcc zu warnen (und -Wunused-Funktionen tun nicht, dass für globale Funktionen)

Die Lösung kann man nicht sein:

  • Löschen von nicht verwendeten Funktionen in der Kompilierung, ohne zu wissen, welche Funktionen in der Laufzeit gelöscht wurden
  • die ELF-Datei analysieren, da nicht jede Funktion wird in jedem Lauf wie gprof (einige Funktionen Tage dauern, bis sie aufgerufen werden werden aufgerufen, aber im Code-Fluss können Sie sehen, dass sie schließlich aufgerufen werden)
  • Ein Dienstprogramm, das tot Code innerhalb Funktionen entdeckt (dh Code nach einer Rückkehr von der Funktion), anstatt ungenutzt Funktionen

Danke

+0

Eine hässliche Idee: Verketten Sie alle Ihre Code-Dateien vorübergehend in einer Datei, machen Sie alle Ihre Funktionen in dieser Datei statisch. Der Compiler wird Ihnen die unbenutzten mitteilen. Aber wahrscheinlich möchten Sie etwas schöner ... –

+0

Vorschlag: die vorverarbeiteten Quellen können vielleicht ein besseres Thema der Analyse sein. – peterh

+0

Verwenden Sie einen Compiler/Linker, der nicht referenzierte Funktionen entfernt und eine Liste dieser Funktionen ausgibt. –

Antwort

0

Wenn Sie etwas genauer, automatisierte oder poliert benötigen, müssen Sie Ihren Compiler und Build-System auf ein Team und machen es für Sie , irgendwie.

Wenn Sie keine genauen Ergebnisse oder etwas besonders automatisiertes oder poliertes benötigen, dann ist hier eine sehr grobe Annäherung: Es findet jedes Wort, das nur einmal in all Ihren .c-Dateien vorkommt.

find . -name \*.c -exec cat {} \; \ 
    | tr -s '[[:space:];:,?!.|()-"<>=]' '\n' \ 
    | sort \ 
    | uniq -u 

Dies könnte natürlich in einer Million Möglichkeiten fehlschlagen: Präprozessor Tricks, Kommentare Funktionsnamen wiederholen, Funktionen verwendet die gleiche wie gemeinsame Wörter genannt in den Kommentaren usw.

1

Der einfachste Weg ist es, die Objektdateien zu verarbeiten Im Projekt würde es eher wie ein Linker aussehen. Es muss nichts anderes getan werden, als unreferenzierte Symbole zu beachten, also ist dies viel einfacher als das Schreiben eines Linkers.

Das Unix/Linux/Cygwin-Dienstprogramm lorder funktioniert, was Sie wollen.