2012-11-11 6 views
8

Czy można powiedzieć GCC, aby użyć flagi warn_unused_result dla wszystkich funkcji, nawet nie mając odpowiedniego atrybutu? Ponieważ jeśli mogę zapomnieć o sprawdzeniu wartości zwracanej, mogę również zapomnieć o dodaniu atrybutu specyficznego dla GCC.Powoduje, że warn_unused_result zastosowane do wszystkich funkcji z GCC

Widziałem to możliwe z innymi kompilatorami.

+0

Od przeglądając dokumentację Powiedziałbym, że odpowiedź brzmi: nie. –

+0

alternatywa: możesz uruchamiać swoje programy za pomocą szyny, testując ignorowane wartości zwracane: http://www.splint.org – justin

+0

Które kompilatory ją obsługują? – sinelaw

Odpowiedz

1

Nie, możesz tylko powiedzieć gcc, aby ignorował wszystkie flagi warn_unused_result z -Wno-unused-result, ale odpowiedni -Wunused-result ustawia tylko wartość domyślną (ostrzegać tylko o flagach). Kompilacja z -Wall -Wextra -pedantic powinna wywołać ostrzeżenie, jeśli można je włączyć, ale tak się nie dzieje, więc nie może.

Poza tym, zastanawiam się, dlaczego chcesz tego, nie jest rzadkie, aby ignorować wynik funkcji, a wszystkie biblioteki będą prawdopodobnie produkować ton ostrzeżeń.

+2

Piszemy własną bibliotekę i chcemy wykluczyć jak najwięcej błędów. Kilka dni temu zauważyłem, że jeden z naszych programistów nie sprawdził wyniku __fread__. Rzeczywiście, taki przypadek jest dość rzadki, ale jeśli dzieje się tak z powodu niskich zasobów na wbudowanym komputerze, nasza biblioteka musi obsługiwać to bez awaryjnej aplikacji głównej. Tak więc, chcemy wykonać jak najwięcej kontroli. – PoltoS

+0

@PoltoS: Jeśli używasz C++, może istnieć sposób na zawijanie typów zwracanych, ale to mniej więcej działa jak 'warn_unused_result'. – bitmask

+0

Używamy C ... Dziwne, że GCC nie dostarcza takiej flagi. Być może uda się ją nieco zhakować, aby "wirtualnie" dodać taką flagę do każdej funkcji? – PoltoS

0

Chociaż nie wydaje się możliwe z GCC, można uruchomić analizatory statyczne, takie jak pokrycie i lint, aby je złapać.

+0

Dobra odpowiedź po prawie 5 latach;) coverty to SAAS. Nie mogę przesłać kodu firmy na serwer innej firmy. Ponadto serwer trzeciej części nie wie nic o moim środowisku, a system zawiera pliki. Nie znalazłem do tej pory dobrych analizatorów statycznych, które nie narzekają na typy specyficzne dla platformy. – PoltoS

+0

Nie jestem pewien, czy pokrycie jest ofertą tylko SaaS. Mój pracodawca używa pokrycia i uważam, że żaden kod nie opuszcza serwerów organizacji. https://community.synopsys.com/s/question/0D53400003RpaYWCAZ/can-cover-coverity-connect-be-installed-in-an-isolated-environment – Soorajchirag

0

Istnieje wtyczka clang, w elfs-clang-plugins (autor autorstwa mnie, open source), która pomaga.

Chociaż nie dla GCC, może być nadal przydatne, np. jeśli możesz dodać go do procesu odstraszania CI (jeśli go masz) lub po prostu uruchamiać ręcznie raz na jakiś czas.

Wtyczka warn_unused_result wyemituje ostrzeżenie o funkcjach, które nie mają atrybutu warn_unused_result w przypadku atrybutu . Wtyczka uwzględnia tylko funkcje zadeklarowane lub zdefiniowane w bieżącej jednostce kompilacji, więc biblioteki zewnętrzne nie dodają szumu.

Wtyczka akceptuje opcjonalny argument arg, --static-only, który powoduje, że ostrzega on tylko o funkcjach statycznych (gdy zmiana zewnętrznych interfejsów API jest zbyt duża).

Przykład:

int foo(void); 

wyjście Compiler:

/tmp/test.c:1:5: warning: missing attribute warn_unused_result 
int foo(void); 
Powiązane problemy