Chciałbym włączyć - dosłownie - WSZYSTKIE ostrzeżenia, które ma GCC. (Myślisz, że to będzie łatwe ...)
Pomyślałbyś, że
-Wall
może załatwić sprawę, ale nie! Nadal potrzebuję-Wextra
.Pomyślałbyś, że
-Wextra
może załatwić sprawę, ale nie! Nie wszystkie ostrzeżenia wymienione tutaj (na przykład-Wshadow
) są włączone przez to. I nadal nie mam pojęcia, czy ta lista jest wyczerpująca.
Jak powiedzieć GCC, aby włączyła (nie, jeśli, i, ale, ale!) Wszystkie ostrzeżenia, które ma?
c++
gcc
warnings
compiler-warnings
gcc-warning
użytkownik541686
źródło
źródło
-Weverything
.Odpowiedzi:
Nie możesz
Podręcznik dla GCC 4.4.0 jest wyczerpujący tylko dla tej wersji, ale zawiera listę wszystkich możliwych ostrzeżeń dla 4.4.0. Nie wszystkie znajdują się na stronie, do której prowadzi link, na przykład niektóre opcje specyficzne dla języka znajdują się na stronach opcji C ++ lub Obj-C. Aby znaleźć je wszystkie, lepiej spojrzeć na Podsumowanie opcji
Włączenie wszystkiego obejmowałoby to,
-Wdouble-promotion
co dotyczy tylko procesorów z 32-bitową jednostką zmiennoprzecinkową o pojedynczej precyzji, która implementuje sięfloat
w sprzęcie, ale emulujedouble
w oprogramowaniu. Wykonywanie obliczeń wdouble
sposób podobny do emulacji oprogramowania i wolniejsze. Jest to istotne w przypadku niektórych wbudowanych procesorów, ale zupełnie nie ma znaczenia w przypadku współczesnych procesorów do komputerów stacjonarnych ze sprzętową obsługą 64-bitowych liczb zmiennoprzecinkowych.Innym ostrzeżeniem, które zwykle nie jest przydatne, jest
-Wtraditional
ostrzeżenie o doskonale uformowanym kodzie, który ma inne znaczenie (lub nie działa) w tradycyjnych C, np. W"string " "concatenation"
definicjach funkcji ISO C! Czy naprawdę zależy Ci na kompatybilności z 30-letnimi kompilatorami? Czy na pewno chcesz ostrzeżenia do pisaniaint inc(int i) { return i+1; }
?Myślę, że
-Weffc++
jest zbyt głośny, aby był użyteczny, opiera się na przestarzałym pierwszym wydaniu Effective C ++ i ostrzega o konstrukcjach, które są całkowicie poprawne w C ++ (i dla których wytyczne zmieniły się w późniejszych wydaniach książki). Nie chcę być ostrzegł, że nie zainicjowałemstd::string
członka w moim konstruktorze; ma domyślnego konstruktora, który robi dokładnie to, co chcę, dlaczego mam pisać,m_str()
aby to nazwać? Te-Weffc++
ostrzeżenia, które byłyby pomocne są zbyt trudne dla kompilator wykryć dokładnie (co daje fałszywie ujemne), a te, które nie są użyteczne, takie jak inicjowanie wszystkich członków jawnie, tylko produkować zbyt dużo hałasu, dając fałszywe alarmy.Luc Danton podał świetny przykład bezużytecznych ostrzeżeń z
-Waggregate-return
tego, że prawie na pewno nigdy nie ma sensu dla kodu C ++.tzn. tak naprawdę nie chcesz wszystkich ostrzeżeń, po prostu myślisz, że tak.
Przejrzyj instrukcję, przeczytaj o nich, zdecyduj, które chcesz włączyć, wypróbuj je. W każdym razie przeczytanie instrukcji kompilatora jest dobrą rzeczą. Skrócenie i włączenie ostrzeżeń, których nie rozumiesz, nie jest dobrym pomysłem, zwłaszcza jeśli chcesz uniknąć korzystania z RTFM.
Każdy, kto po prostu wszystko włącza, prawdopodobnie robi to, ponieważ nie ma pojęcia, bo albo spiczasty szef powiedział „bez ostrzeżeń”.
Niektóre ostrzeżenia są ważne, a niektóre nie. Musisz być dyskryminujący lub popsuć swój program. Rozważmy na przykład
-Wdouble-promotion
. Jeśli pracujesz w systemie wbudowanym, możesz tego chcieć; jeśli pracujesz na systemie stacjonarnym, prawdopodobnie nie. A chcesz-Wtraditional
? Wątpię.Edycja: Zobacz także -Wall-all, aby włączyć wszystkie ostrzeżenia, które są zamknięte jako WONTFIX.
Edycja 2: w odpowiedzi na skargę DevSolar dotyczącą plików makefile, które muszą używać różnych ostrzeżeń w zależności od wersji kompilatora, jeśli
-Wall -Wextra
nie jest to odpowiednie, użycie CFLAGS specyficznych dla kompilatora i wersji:źródło
-Weverything
jest, moim zdaniem, lepszym rozwiązaniem niż strategia gcc polegająca na nie dawaniu takiej możliwości. Używam tej flagi z clang, ponieważ moja filozofia polega na tym, że domyślnie chcę, aby wszystkie ostrzeżenia były włączone (ponieważ ktoś uważał, że wystarczy dodać go do kompilatora), a jeśli mi się to nie podoba, wyłączam to ostrzeżenie. Chodzi o to, że nie wiesz o ostrzeżeniach, które się nie uruchamiają, ale wiesz o ostrzeżeniach, których nie chcesz, aby się uruchamiały, i można je łatwo wyłączyć.-Weverything
opcji Clanga , ale nie jest to możliwe w przypadku GCC.Zgadzam się z poprzednimi odpowiedziami, że włączenie dosłownie wszystkich ostrzeżeń prawdopodobnie nie jest korzystne, jednak GCC zapewnia dość dogodny sposób na osiągnięcie tego. Komenda
zawiera listę wszystkich obsługiwanych opcji ostrzeżeń z informacją, czy są one aktywne. Można to przy okazji wykorzystać, aby dowiedzieć się, które opcje są (nie) włączone przez np.
-Wall
I-Wextra
Aby włączyć wszystkie ostrzeżenia, możesz użyć wyrażenia regularnego, aby wyodrębnić parametry wiersza polecenia
Dla mojego obecnego GCC daje to:
Można to teraz wykorzystać do wywołania GCC, tj
Należy jednak pamiętać, że powoduje to ostrzeżenia, ponieważ niektóre opcje ostrzeżeń są dostępne tylko dla niektórych języków (np
C++
.). Można tego uniknąć, stosując więcej wyrażeń regularnych, aby uwzględnić tylko opcje dozwolone dla bieżącego języka lub dodając odpowiedni-Wno-whatever
na końcu połączenia.źródło
-isystem
zamiast-I
odpowiednich katalogów.Po prostu niemożliwe jest zaprogramowanie z włączonymi wszystkimi ostrzeżeniami (chyba że masz zamiar je zignorować, ale w takim razie po co to przeszkadzać?). Na przykład, załóżmy użyć poniższy zestaw flag:
-Wstrict-prototypes -Wtraditional
.Nawet przy włączonych dwóch ostrzeżeniach następujący program będzie narzekał.
Możesz pomyśleć „no cóż, wtedy użyję prototypów starego stylu”. Nie, to nie zadziała.
I nie, nieokreślenie żadnego prototypu jest również błędne, ponieważ kompilator również narzeka.
Jeśli zdefiniujesz jakieś funkcje w swoim programie, nie będziesz mógł używać wszystkich flag, ponieważ kompilator będzie narzekał na każdą możliwą do wyobrażenia definicję funkcji.
W przypadku C ++ jest to możliwe (
-Wtraditional
flaga nie istnieje) i można skompilować bardzo proste programy. Aby włączyć wszystkie ostrzeżenia, skorzystaj z poniższej listy ostrzeżeń (prawdopodobnie niektóre ostrzeżenia są zduplikowane, ponieważ nie zawracałem sobie głowy filtrowaniem włączonych ostrzeżeń-Wall
).źródło
int main(int, char **); int main(argc, argv) int argc; char **argv; { (void)argc; (void)argv; return 0; }
Ktoś stworzył zestaw narzędzi do określania pełnego zestawu ostrzeżeń dla danej wersji GCC lub Clang.
W przypadku GCC kopiowanie z pełnej listy ostrzeżeń dostarczonych przez to narzędzie dla twojej wersji kompilatora wydaje się być jedynym sposobem na upewnienie się, że wszystkie ostrzeżenia są włączone, ponieważ (w przeciwieństwie do Clanga) GCC nie zapewnia
-Weverything
.Narzędzie wydaje się analizować rzeczywisty
c.opt
plik w kodzie źródłowym GCC, więc jego wyniki powinny być ostateczne.Repozytorium zawiera również pliki tekstowe z listami ostrzegawczymi wygenerowanymi dla większości wersji GCC i Clang (obecnie Clang 3.2 do 3.7 i GCC 3.4 do 5.3).
https://github.com/barro/compiler-warnings
źródło
Gcc 4.3+ ma teraz -Q --help = ostrzeżenia, możesz nawet podać --help = ostrzeżenia, C, aby po prostu wydrukować ostrzeżenia związane z C.
Właśnie napisałem moduł m4, aby skorzystać z tego (obsługuje także clang -Weverything), patrz wget_manywarnings.m4
Sposób użycia jest dość prosty, w zasadzie moduł włącza każdą flagę ostrzegania. W razie potrzeby usuwasz ostrzeżenia - niektóre z nich są naprawdę bardzo szczegółowe. Przykład: configure.ac
Jeśli nie korzystasz z narzędzi automatycznych, znajdziesz kod, aby włączyć wszystkie wyłączone ostrzeżenia w module m4, co w zasadzie jest wywołaniem gcc przesyłanym przez awk:
flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'
źródło
Z tej strony :
Myślę, że pytanie brzmi, które z nich ? Być może mógłbyś grepować tę stronę dla wszystkich linii zaczynających się na -W i uzyskać pełną listę flag ostrzegawczych. Następnie porównaj te z listami pod
-Wall
i-Wextra
. Jest też-Wpedantic
, choć oczywiście chcesz być jeszcze bardziej pedantyczny =)źródło
Prawdopodobnie jest, ale jedyna lista, która jest w 100% wyczerpująca, jest faktycznym źródłem kompilatora. Jednak GCC jest duży ! I nie wiem, czy wszystkie parametry wiersza polecenia są zebrane w jednym miejscu, czy rozłożone na kilka plików źródłowych. Zauważ też, że niektóre ostrzeżenia dotyczą preprocesora, niektóre dla faktycznego kompilatora, a niektóre dla linkera (który jest całkowicie oddzielnym programem i znajduje się w pakiecie binutils), więc najprawdopodobniej są rozłożone.
źródło