Was ist das beste Befehlszeilentool zum Bereinigen von Code?
Lesezeit: 6 Minuten
Chris
Wenn ich C-Code schreibe, verwende ich ausschließlich einen Editor und gcc. Ich habe mich gefragt, ob jemand ein gutes und einfaches Tool vorschlagen könnte, das ungenutzte Variablen und Funktionsdeklarationen findet und möglicherweise einige Optimierungen vornimmt.
Kennt jemand ein gutes Tool?
Wenn Sie eine Optimierung benötigen, können Sie den Schalter -O von gcc verwenden.
– hyperboreisch
25. Dezember 2008 um 22:22 Uhr
Voting to close as tool rec.
– Ciro Santilli OurBigBook.com
2. Juli 2015 um 12:16 Uhr
Jonathan Leffler
Wie Dan Fego betonte, kann GCC ungenutzte Variablen und ungenutzte statische Funktionen abfangen. Es findet normalerweise keine ungenutzten externen Funktionen, da es normalerweise eine Quelldatei auf einmal bearbeitet.
GCC (v4.3.2) hat Hunderte, wenn nicht Tausende von Optionen. Eine, die helfen könnte, ist ‘--combine‘, um Quelldateien zu kombinieren (solange Sie nicht die Gewohnheit haben, dieselben Funktions- oder Variablennamen in verschiedene Quelldateien einzufügen).
Die Option ‘--help‘ sagt dir mehr; die Optionen ‘--help=optimizers‘ und ‘--help=warnings‘ geben Ihnen jeweils ein paar hundert Ausgabezeilen. Zu den Warnungen gehören:
-Wunused This switch lacks documentation
-Wunused-function Warn when a function is unused
-Wunused-label This switch lacks documentation
-Wunused-macros Warn about macros defined in the main file that
are not used
-Wunused-parameter Warn when a function parameter is unused
-Wunused-value Warn when an expression value is unused
-Wunused-variable Warn when a variable is unused
Hinzugefügt: Dies ist ein Skript namens glint die ich verwende, um meinen Code zu bereinigen. Es ist ziemlich alt, also verwendet es nicht das ‘#!/bin/sh‘ Notation für die erste Zeile und es heißt ‘$*‘ Anstatt von ‘"$@"‘, die beide behoben werden sollten, aber keine dringend behoben werden müssen. Beachten Sie, dass, obwohl GCC 4.x die ‘-fwriteable-strings‘ Option unterstützt es immer noch die ‘-Wwrite-strings‘ Option und das hat einen Wert.
Dieses Skript demonstriert, dass Sie mit nur wenig Arbeit viel Nutzen aus vorhandenen Tools ziehen können. Sie können fast jede Option konfigurieren, die es verwendet – wenn auch hauptsächlich über die Umgebung und nicht über die Befehlszeile. Natürlich können Sie der Befehlszeile zusätzliche Warnoptionen hinzufügen; Was Sie nicht tun können, ist, vorgegebene Optionen außer über die Umgebung zu entfernen. Aber das ist in Ordnung; Sie werden aus guten Gründen standardmäßig ausgewählt. Heutzutage würde ich wahrscheinlich ‘GLINT_ANSI=-std=c99‘ oder das Skript reparieren; Ich habe es in letzter Zeit nicht viel benutzt, da ich ziemlich nah am Standard kodiere glint erzwingt. (Notiere dass der ‘-o /dev/null‘ bedeutet, dass Sie jeweils nur eine Datei bearbeiten können; Hack zum Reparieren!)
: "@(#)$Id: glint.sh,v 1.5 2002/08/09 21:40:52 jleffler Exp jleffler $"
#
# Use GCC as excruciatingly pedantic lint
# Not a complete replacement for lint -- it doesn't do inter-file checking.
# Now configurable via the environment.
# Use GLINT_EXTRA_FLAGS to set extra flags via the environment.
# NB: much Solaris code won't work with -undef enabled.
: ${GLINT_GCC:='gcc'}
: ${GLINT_ANSI='-ansi'}
: ${GLINT_FNO_COMMON='-fno-common'}
: ${GLINT_FSHORT_ENUMS='-fshort-enums'}
: ${GLINT_PEDANTIC='-pedantic'}
: ${GLINT_UNDEF='-undef'}
: ${GLINT_W='-W'}
: ${GLINT_WAGGREGATE_RETURN='-Waggregate-return'}
: ${GLINT_WALL='-Wall'}
: ${GLINT_WCAST_ALIGN='-Wcast-align'}
: ${GLINT_WCAST_QUAL='-Wcast-qual'}
: ${GLINT_WCONVERSION='-Wconversion'}
: ${GLINT_WMISSING_DECLARATIONS='-Wmissing-declarations'}
: ${GLINT_WREDUNDANT_DECLS='-Wredundant-decls'}
: ${GLINT_WMISSING_PROTOTYPES='-Wmissing-prototypes'}
: ${GLINT_WNESTED_EXTERNS='-Wnested-externs'}
: ${GLINT_WPOINTER_ARITH='-Wpointer-arith'}
: ${GLINT_WSHADOW='-Wshadow'}
: ${GLINT_WSTRICT_PROTOTYPES='-Wstrict-prototypes'}
: # ${GLINT_WTRADITIONAL='-Wtraditional'}
: ${GLINT_WWRITE_STRINGS='-Wwrite-strings'}
exec ${GLINT_GCC} \
${GLINT_ANSI} \
${GLINT_FNO_COMMON} \
${GLINT_FSHORT_ENUMS} \
${GLINT_PEDANTIC} \
${GLINT_UNDEF} \
${GLINT_WAGGREGATE_RETURN} \
${GLINT_WALL} \
${GLINT_WCAST_ALIGN} \
${GLINT_WCAST_QUAL} \
${GLINT_WCONVERSION} \
${GLINT_WMISSING_DECLARATIONS} \
${GLINT_WREDUNDANT_DECLS} \
${GLINT_WMISSING_PROTOTYPES} \
${GLINT_WNESTED_EXTERNS} \
${GLINT_WPOINTER_ARITH} \
${GLINT_WSHADOW} \
${GLINT_WSTRICT_PROTOTYPES} \
${GLINT_WTRADITIONAL} \
${GLINT_WWRITE_STRINGS} \
${GLINT_W} \
${GLINT_EXTRA_FLAGS} \
-o /dev/null -O4 -g -c $*
Fussel ist das klassische Werkzeug zur Überprüfung des Stils in C-Programmen. Es gibt eine modernere Inkarnation davon namens Schiene.Dieser Wikipedia-Eintrag hat eine Liste statischer Codeanalyse-Tools, einige kostenlos, andere kommerziell.
Obwohl ich sicher bin, dass dies keine vollständige Liste von ist Statische Codeanalyse Tools, hier sind meine Eindrücke von einigen verschiedenen, mit denen ich in der Vergangenheit gearbeitet habe. (Ich arbeite hauptsächlich mit C.)
Schiene: Ich benutze Splint oft, weil es für viele GNU/Linux-Distributionen verfügbar ist. Es ist relativ einfach damit zu arbeiten; es neigt jedoch dazu, überwältigend zu sein, wenn unter den strengsten Einstellungen gearbeitet wird. Darüber hinaus kann die manchmal notwendige Verwendung von Anmerkungen leicht lesbaren Code überladen und verschleiern. Unabhängig davon empfehle ich, es zu verwenden.
Uno: Uno ist definitiv vielversprechend, aber es ist nicht so streng wie Splint (von Natur aus). Stattdessen konzentriert es sich auf die Klarheit und Nützlichkeit seiner Warnungen. Für mich ist Uno nur als Ergänzung zu Splint sinnvoll (um deutlich auf Warnungen hinzuweisen, die unter den vergleichsweise vielen, die Splint ausgibt, versteckt sind).
PC-lint: Ich finde, dass PC-Lint für ein proprietäres Programm unhandlich ist. Ich habe es einmal bei der Entwicklung für MS-DOS verwendet, und kryptische Namen, die es für seine Fehler verwendet, machten es sehr schwierig, es zu verwenden. Soweit ich höre, gibt es viele bessere Produkte für MS-DOS.
Pscan: (Toter Hyperlink) Pscan eignet sich hervorragend zum Auffinden von Format-String-Schwachstellen! Wie bei Uno schlage ich vor, es als Ergänzung zu Splint zu verwenden.
PC-Lint-Kommentare sind mir seltsam – einige der besten Dokumentationen, die ich je gesehen habe. Es ist unhandlich aufgrund einer großen Anzahl von Optionen und Fehlern – aber meiner Meinung nach liegt das in der Natur des Biests. Es sei denn, Sie möchten die Definition eines anderen, was überprüft / ignoriert werden soll.
– Steve Fallows
5. Januar 2009 um 12:20 Uhr
@ Steve: Ich muss die Dokumentation verpasst haben. Ich habe den Beitrag korrigiert, um niemanden in die Irre zu führen. Vielen Dank.
– anon
5. Januar 2009 um 19:12 Uhr
Wenn Sie gcc mit -Wall ausführen, werden einige der von Ihnen erwähnten Dinge erfasst, z. B. nicht verwendete Variablen (und möglicherweise nicht verwendete Funktionen). In Bezug auf Optimierungen mache ich das nicht, obwohl der Compiler im Allgemeinen intelligent genug ist, um die Arten von Optimierungen vorzunehmen, die wichtig sind, also würde ich mir keine allzu großen Sorgen machen. Verwenden Sie nur keine schrecklichen Algorithmen. 😉
Charly Martin
Schiene (http://www.splint.org/) ist ganz ausgezeichnet; Ich habe es bei Megaline-Codes verwendet, um nach so etwas zu suchen,
(Aktualisiert: Jeder möchte Art Director werden.)
Eine URL für Splint anzugeben wäre nett. Der Satz „nach dem Semikolon“ muss geklärt werden. Mir ist nicht klar, ob „itm one megaline codes“ ein anderes Produkt oder ein Tippfehler für „it on megaline codes“ ist, was große Codebasen bedeutet.
– Jonathan Leffler
4. Januar 2009 um 17:28 Uhr
Wie wäre es, wenn Sie einen Profiler verwenden und herausfinden, welcher Code am häufigsten ausgeführt wird, und sich auf diese Teile konzentrieren?
Vielleicht kann gprof helfen?
/Johannes
Bearbeiten: Oder da Sie über die Bereinigung gesprochen haben, kehren Sie meine Antwort oben um und entfernen Sie den Code, der nie ausgeführt wird.
Eine URL für Splint anzugeben wäre nett. Der Satz „nach dem Semikolon“ muss geklärt werden. Mir ist nicht klar, ob „itm one megaline codes“ ein anderes Produkt oder ein Tippfehler für „it on megaline codes“ ist, was große Codebasen bedeutet.
– Jonathan Leffler
4. Januar 2009 um 17:28 Uhr
13831000cookie-checkWas ist das beste Befehlszeilentool zum Bereinigen von Code?yes
Wenn Sie eine Optimierung benötigen, können Sie den Schalter -O von gcc verwenden.
– hyperboreisch
25. Dezember 2008 um 22:22 Uhr
Voting to close as tool rec.
– Ciro Santilli OurBigBook.com
2. Juli 2015 um 12:16 Uhr