2013-04-12 14 views
9

Zgodnie z zasadami firmy każda funkcja w kodzie źródłowym C ma prototyp. Odziedziczyłem projekt z własnym systemem make (więc nie mogę go przetestować w gcc lub Visual Studio) i odkryłem, że jeden z plików ma kilka funkcji statycznych zadeklarowanych bez prototypów. Czy istnieje sposób (niekoniecznie z kompilatorem) do wypisania wszystkich funkcji bez prototypów we wszystkich plikach .c?Jak znaleźć funkcje C bez prototypu?

+2

funkcje statyczne naprawdę nie trzeba prototypy, chyba że są one nazywane, zanim zostaną one zdefiniowane –

+0

@Paul: Tak, ale przypuszczam, że to pozwala kierownika projektu, aby szybko zobaczyć, jakie są dostępne itp – Gnubie

+1

Jeśli funkcje nie możesz użyć innego kompilatora, z nieznanych przyczyn, będziesz musiał uzyskać osobne narzędzie do analizy statycznej. Wszystkie takie narzędzia na rynku znajdą wszystkie brakujące prototypy dla ciebie, – Lundin

Odpowiedz

12

gcc ma opcję, aby ostrzec cię o tym:

gcc -Wmissing-prototypes 

Można włączyć to ostrzeżenie do błędu zatrzymania kompilacji i zmusić ludzi, aby je naprawić:

gcc -Werror=missing-prototypes 

Jeśli tylko chcesz aby go wyświetlić, możesz skompilować z opcją gcc opcję -Wmissing-prototypes i grep dla brak wcześniejszego prototypu dla w dzienniku.

Aktualizacja oparta na edycji:

Ponieważ teraz wspomnieć, że nie można używać gcc, trzeba będzie znaleźć podobną opcję dla bieżącej kompilator. Większość kompilatorów ma taką opcję. Rozpocznij od strony podręcznika lub wbudowanego wyjścia pomocy.

+0

Przepraszam, jeśli nie wyjaśniłem, ale ma on własny system kompilacji, więc nie mogę go przetestować na gcc. – Gnubie

+5

"system kompilacji"! = "Kompilator". Zakładam, że jakikolwiek kompilator użyty w tym niestandardowym systemie kompilacji (gcc/icc/clang/.......) ma różne opcje/przełączniki, aby włączyć ostrzeżenia/błędy/itd. To byłby początek, nawet jeśli to nie jest gcc ... – twalberg

+0

ok, sprawdzę to. Dziękuję wszystkim! – Gnubie

5

ctags może to zrobić!

--c-kinds=p generuje listę wszystkich prototypów funkcji

--c-kinds=f generuje listę wszystkich definicji funkcji

Teraz wystarczy porównać te.

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 To miłe rozwiązanie! – jman