2013-04-12 13 views
9

Unternehmensrichtlinien schreiben vor, dass jede Funktion im C-Quellcode einen Prototyp hat. Ich habe ein Projekt mit einem eigenen make-System geerbt (so kann ich nicht es auf gcc oder Visual Studio testen) und festgestellt, dass eine der Dateien einige statische Funktionen ohne Prototypen deklariert hat. Gibt es einen Weg (nicht unbedingt mit einem Compiler) alle Funktionen ohne Prototypen in allen .c Dateien aufzulisten?Wie finden Sie C-Funktionen ohne einen Prototyp?

+2

statische Funktionen nicht wirklich brauchen Prototypen, es sei denn, sie genannt werden, bevor sie definiert sind –

+0

@ Paul: Ja, aber ich nehme an, es den Projektmanager ermöglicht es, schnell zu sehen, welche Funktionen verfügbar sind usw. – Gnubie

+1

Wenn Sie können keinen anderen Compiler verwenden. Aus unbekannten Gründen müssen Sie ein separates Tool zur statischen Analyse erstellen. Alle diese Werkzeuge auf dem Markt werden alle fehlenden Prototypen für Sie finden – Lundin

Antwort

12

gcc hat eine Option, Sie darüber zu warnen:

gcc -Wmissing-prototypes 

Sie diese Warnung in einen Fehler machen kann es Kompilierung und die Menschen zwingen, beheben zu stoppen:

gcc -Werror=missing-prototypes 

Wenn Sie nur wollen um es aufzulisten können Sie mit der gcc Option -Wmissing-prototypes und grep für keinen vorherigen Prototyp für im Protokoll kompilieren.

aktualisieren basierend auf bearbeiten:

Da Sie jetzt erwähnen, dass Sie nicht gcc verwenden können, erhalten Sie eine ähnliche Option für Ihren aktuellen Compiler finden müssen. Die meisten Compiler haben eine solche Option. Beginnen Sie mit der Manpage oder der integrierten Hilfeausgabe.

+0

Sorry, wenn ich es nicht klar gemacht habe, aber es hat sein eigenes Build-System, also kann ich es nicht auf gcc testen. – Gnubie

+5

"Build-System"! = "Compiler". Ich würde annehmen, dass jeder Compiler, den dieses System verwendet (gcc/icc/clang/.......), verschiedene Optionen/Schalter hat, um Warnungen/Fehler/etc. Zu aktivieren. Das wäre der richtige Ort, um loszulegen, auch wenn es nicht gcc ist ... – twalberg

+0

ok, ich werde es überprüfen. Danke allen! – Gnubie

5

ctags kann das tun!

--c-kinds=p erzeugt die Liste aller Funktionsprototypen

--c-kinds=f erzeugt die Liste aller Funktionsdefinitionen

Jetzt müssen Sie nur diejenigen vergleichen.

diff -u <(ctags -R -x --sort=yes --c-kinds=f | cut -d' ' -f1) <(ctags -R -x --sort=yes --c-kinds=p | cut -d' ' -f1) | sed -n 's/^-//p'

+0

+1 das ist eine schöne Lösung! – jman

Verwandte Themen