Przydatne flagi GCC dla C

Poza ustawieniem -Wall i ustawieniem -std=XXX, Jakie inne przydatne, ale mniej znane flagi kompilatora są do użycia w C?

Jestem szczególnie zainteresowany dodatkowymi ostrzeżeniami i / lub zamienianiem ostrzeżeń w Błędy w niektórych przypadkach, aby absolutnie zminimalizować przypadkowe niedopasowanie typu.

Author: Matt Joiner, 2010-07-31

23 answers

Kilka opcji generowania kodu -f jest interesujących:

  • Funkcja -ftrapv spowoduje przerwanie programu przy podpisanym przepełnieniu całkowitym (formalnie "undefined behavior" w C).

  • -fverbose-asm jest przydatny, jeśli kompilujesz z -S w celu zbadania wyjścia złożenia-dodaje kilka uwag informacyjnych.

  • -finstrument-functions dodaje kod do wywołania funkcji profilowania dostarczanych przez użytkownika w każdym punkcie wejścia i wyjścia funkcji.

 62
Author: caf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 01:35:14

Oto moje:

  • -Wextra, -Wall: Niezbędne.
  • -Wfloat-equal: przydatne, ponieważ zwykle testowanie liczb zmiennoprzecinkowych dla równości jest złe.
  • -Wundef: ostrzegaj, jeśli w dyrektywie #if oceniany jest niezaliczony identyfikator.
  • -Wshadow: Ostrzegaj, gdy zmienna lokalna cieniuje inną zmienną lokalną, parametr lub zmienną globalną lub gdy wbudowana funkcja jest cieniowana.
  • -Wpointer-arith: ostrzegaj, jeśli cokolwiek zależy od wielkości funkcji lub void.
  • -Wcast-align: Ostrzegaj, gdy wskaźnik zostanie rzucony, tak aby wymagane wyrównanie celu zostało zwiększone. Na przykład, ostrzegaj, jeśli char * jest rzucana do int * na maszynach, gdzie liczby całkowite są dostępne tylko na granicach dwu-lub czterobajtowych.
  • -Wstrict-prototypes: ostrzegaj, jeśli funkcja jest zadeklarowana lub zdefiniowana bez podawania typów argumentów.
  • -Wstrict-overflow=5: ostrzega o przypadkach, w których kompilator optymalizuje się w oparciu o założenie, że podpisane przepełnienie nie występuje. (Wartość 5 może to być zbyt surowe, patrz strona podręcznika.)
  • -Wwrite-strings: podaj stałe łańcuchowe typu const char[Długość] aby skopiować adres jednego z nich do wskaźnika Nie-const char *, zostanie wyświetlone ostrzeżenie.
  • -Waggregate-return: ostrzegaj, jeśli jakiekolwiek funkcje zwracające struktury lub związki są zdefiniowane lub wywołane.
  • -Wcast-qual: Ostrzegaj, gdy wskaźnik jest rzucany, aby usunąć kwalifikator typu z docelowego typu*.
  • -Wswitch-default: Ostrzegaj, gdy switch wypowiedź nie ma default case*.
  • -Wswitch-enum: Ostrzegaj, gdy switch deklaracja ma indeks typu wyliczeniowego i nie ma case dla jednego lub więcej nazwanych kodów tego wyliczenia*.
  • -Wconversion: ostrzegaj o niejawnych konwersjach, które mogą zmienić wartość*.
  • -Wunreachable-code: ostrzegaj, jeśli kompilator wykryje, że kod nigdy nie zostanie wykonany*.

Te oznaczone * czasami daje zbyt wiele fałszywych ostrzeżeń, więc używam ich w razie potrzeby podstawa.

 129
Author: Alok Singhal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 02:10:52

Zawsze używaj -O lub wyżej (-O1, -O2, -Os, itd.). Na domyślnym poziomie optymalizacji, gcc idzie na szybkość kompilacji i nie wykonuje wystarczającej analizy, aby ostrzec o rzeczach takich jak unitialized variables.

Rozważ wprowadzenie -Werror Polityki, ponieważ ostrzeżenia, które nie zatrzymują kompilacji, są zazwyczaj ignorowane.

-Wall dość dużo włącza ostrzeżenia, które są bardzo prawdopodobne, aby być błędy.

Ostrzeżenia zawarte w -Wextra mają tendencję do oznaczania wspólnego, zgodnego z prawem kodu. Mogą być przydatne do przeglądania kodu (chociaż programy w stylu lint znajdują dużo więcej pułapek są bardziej elastyczne), ale nie włączałbym ich do normalnego rozwoju.

-Wfloat-equal jest to dobry pomysł, jeśli deweloperzy w projekcie nie są zaznajomieni z zmiennoprzecinkowymi, a zły pomysł, jeśli są.

-Winit-self jest przydatny; zastanawiam się, dlaczego nie jest zawarty w -Wuninitialized.

-Wpointer-arith jest przydatny, jeśli masz głównie-przenośny Kod, który nie działa z -pedantic.

 50
Author: Gilles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 22:29:27
-save-temps

To pozostawia za sobą wyniki preprocesora i montażu.

Wstępnie przetworzone źródło jest przydatne do debugowania makr.

Montaż jest przydatny do określenia, jakie optymalizacje weszły w życie. Na przykład, możesz sprawdzić, czy GCC wykonuje optymalizację wywołań ogonowych dla niektórych funkcji rekurencyjnych, ponieważ bez niej możesz potencjalnie przepełnić stos.

 37
Author: catphive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-06 21:50:44

Dziwię się, że nikt jeszcze tego nie powiedział - najbardziej użyteczną flagą jest -g, która umieszcza informacje debugujące w pliku wykonywalnym tak, że można je debugować i przejść przez źródło (chyba, że jesteś biegły i czytasz assembly i jak stepi polecenie) programu podczas jego wykonywania.

 35
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 22:23:27

-fmudflap -- dodaje kontrole runtime do wszystkich ryzykownych operacji pointerowych, aby złapać UB. To skutecznie uodparnia program ponownie przepełnienia bufora i pomaga złapać wszelkiego rodzaju zwisające wskaźniki.

Oto demo:

$ cat mf.c 
int main()
{
 int a[10];
 a[10]=1; // <-- o noes, line 4
}

$ gcc -fmudflap mf.c -lmudflap
$ ./a.out 
*******
mudflap violation 1 (check/write): time=1280862302.170759 ptr=0x7fff96eb3d00 size=44
pc=0x7f3a575503c1 location=`mf.c:4:2 (main)'
      /usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f3a575503c1]
      ./a.out(main+0x90) [0x400a54]
      /lib/libc.so.6(__libc_start_main+0xfd) [0x7f3a571e2c4d]
Nearby object 1: checked region begins 0B into and ends 4B after
mudflap object 0xf9c560: name=`mf.c:3:6 (main) a'
bounds=[0x7fff96eb3d00,0x7fff96eb3d27] size=40 area=stack check=0r/3w liveness=3
alloc time=1280862302.170749 pc=0x7f3a57550cb1
number of nearby objects: 1
 35
Author: Nordic Mainframe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 19:07:51

Nie do końca związane z C / C++, ale przydatne w każdym razie:

@file

Umieść wszystkie powyższe dobre flagi (które wszyscy podaliście) w 'pliku' i użyj powyższej flagi, aby użyć wszystkich flag w tym Pliku razem.

Eg:

Plik: compilerFlags

-Ściana

- std=c99

-Wextra

Następnie Kompiluj:

gcc yourSourceFile @compilerFlags
 16
Author: Amit Tomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 06:47:00

-march=native aby stworzyć zoptymalizowany kod dla platformy (=chip), na której kompilujesz

 15
Author: Jens Gustedt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 07:33:17

Jeśli chcesz znać flagi preprocesora, które są predefiniowane przez kompilator:

echo | gcc -E -dM -
 13
Author: sizzzzlerz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 13:46:59

Nie jest to zbyt pomocne w wykrywaniu błędów, ale rzadko wspominana opcja -masm=intel sprawia, że korzystanie z -S do kontroli wyjścia złożenia jest o wiele przyjemniejsze.

Składnia AT&T assembly za bardzo rani mi głowę.

 13
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 06:15:31

Mój makefile zazwyczaj zawiera

  CFLAGS= -Wall -Wextra -Weffc++ -Os -ggdb
  ...
  g++ $(CFLAGS) -o junk $<
  gcc $(CFLAGS) -o $@ $<
  rm -f junk

Najważniejsze z tych opcji zostały omówione wcześniej, więc zwrócę uwagę na dwie funkcje, które nie zostały jeszcze wskazane:

Mimo że pracuję nad bazą kodową, która potrzebuje , aby być zwykłym C dla przenośności na jakąś platformę, która nadal nie ma przyzwoitego kompilatora C++, robię" dodatkową " kompilację z kompilatorem C++ (Oprócz kompilatora C). Który ma 3 zalety:

  1. kompilator C++ czasami daje mi lepsze komunikaty ostrzegawcze niż kompilator C.
  2. kompilator C++ akceptuje opcję-weffc++, która czasami daje mi kilka przydatnych wskazówek, których bym nie zrozumiał, gdybym skompilował go tylko w prostym C.
  3. mogę zachować kod stosunkowo łatwy do przeniesienia do C++, unikając kilku warunków brzegowych, w których zwykły kod C jest nieprawidłowym kodem C++ (np. zdefiniowanie zmiennej o nazwie "bool").
Tak, jestem beznadziejnie optymistyczną Pollyanną, która ciągle myśli to z pewnością już za miesiąc, kiedy jedna platforma albo zostanie uznana za przestarzałą, albo zyskamy porządny kompilator C++ i będziemy mogli w końcu przełączyć się na C++. Moim zdaniem jest to nieuniknione. pytanie tylko, czy to się dzieje przed czy po zarządzaniu w końcu każdemu wydaje kucyka. :-)
 10
Author: David Cary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-14 01:23:07
-Wstrict-prototypes -Wmissing-prototypes
 9
Author: ninjalj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 22:32:46

Oto wielka flaga, o której nie wspomniano:

-Werror-implicit-function-declaration

Podaj błąd za każdym razem, gdy funkcja jest używana przed jej zadeklarowaniem.

 9
Author: Matt Joiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-14 15:59:57
man gcc

Podręcznik jest pełen ciekawych FLAG z dobrymi opisami. Jednak-Wall prawdopodobnie sprawi, że gcc będzie tak gadatliwy, jak to tylko możliwe. Jeśli chcesz uzyskać więcej interesujących danych, powinieneś rzucić okiem na valgrind lub inne narzędzie do sprawdzania błędów.

 8
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 22:09:07

Cóż, -Wextra też powinno być standardowo. -Werror zamienia ostrzeżenia W błędy(które mogą byćbardzo irytujące, zwłaszcza jeśli kompilujesz Bez -Wno-unused-result). -pedantic w połączeniu z std=c89 daje dodatkowe ostrzeżenia, jeśli używasz funkcji C99.

Ale to wszystko. Nie można dostroić kompilatora C do czegoś bardziej typowego niż sam C.
 6
Author: RWS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 22:14:04

Istnieje -Werror, która traktuje wszystkie ostrzeżenia jako błędy i zatrzymuje kompilację. Na gcc strona podręcznika wyjaśnia każdy przełącznik wiersza poleceń dla Twojego kompilatora.

 6
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 23:12:21

-M* Rodzina opcji.

Pozwalają one tworzyć pliki, które automatycznie ustalają, od których plików nagłówkowych powinny zależeć pliki źródłowe c lub c++. GCC wygeneruje pliki make z tą informacją o zależnościach, a następnie dołączysz je z podstawowego pliku make.

Oto przykład bardzo ogólnego pliku makefile używającego -MD i - MP, który skompiluje katalog pełen plików źródłowych i nagłówkowych c++ i wyliczy wszystkie zależności automatycznie:

CPPFLAGS += -MD -MP                                         
SRC = $(wildcard *.cpp)                                                       

my_executable: $(SRC:%.cpp=%.o)                                                        
        g++ $(LDFLAGS) -o $@ $^                                               

-include $(SRC:%.cpp=%.d)

Oto wpis na blogu, który omawia go bardziej szczegółowo: http://www.microhowto.info/howto/automatically_generate_makefile_dependencies.html

 4
Author: catphive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-06 21:47:37

-Wfloat-equal

From: http://mces.blogspot.com/2005/07/char-const-argv.html

Jednym z nowych ostrzeżeń, które lubię, jest-wfloat-equal. Ten ostrzega, gdy [masz] liczbę zmiennoprzecinkową w stanie równości. To briliant! Jeśli każdy ma zaprogramowaną grafikę komputerową lub (co gorsza:) algorytm geometrii obliczeniowej, wiesz, że żadne dwa pływaki nigdy nie dorównują równości...

 4
Author: stud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-26 14:47:42

Znalazłem ten wątek szukając flagi do naprawy konkretnego problemu, nie widzę go tutaj, więc dodam jeden, który właśnie mnie potykał mój post :

Flaga -Wformat=2

-Wformat => Sprawdź połączenia do printf i scanf, itp., aby upewnić się, że podane argumenty mają typy odpowiednie do podanego formatu...

I naprawdę ważna część o tym ( zgodnie z podręcznikiem GCC):

-Wformat zawiera w -Wall. Aby uzyskać większą kontrolę nad niektórymi aspektami sprawdzania formatu, opcje-Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security, i -Wformat=2 są dostępne, ale nie są zawarte w ścianie.`

To, że masz -Wall nie znaczy, że masz wszystko. ;)

 4
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:42

Czasami używam -s dla znacznie mniejszego pliku wykonywalnego:

-s
    Remove all symbol table and relocation information from the executable.

Źródło: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options

 3
Author: Vasiliy Sharapov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 00:38:41

Chociaż ta odpowiedź może być nieco off-topic I pytanie jest godne +1 ode mnie, ponieważ

Jestem szczególnie zainteresowany dodatkowymi ostrzeżeniami i / lub zamienianiem ostrzeżeń w Błędy w niektórych przypadkach, aby absolutnie zminimalizować przypadkowe niedopasowanie typu.
jest narzędzie, które powinno wyłapać Wszystkie błędy i potencjalne błędy, które mogą nie być oczywiste, jest splint {[7] } które IMHO lepiej wyłapuje błędy w porównaniu do gcc lub innych kompilator. To godne narzędzie, które możesz mieć w swojej skrzyni narzędziowej.

Statyczne sprawdzanie za pomocą narzędzia typu lint, takiego jak splint, powinno być częścią zestawu narzędzi kompilatora.

 3
Author: t0mm13b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 15:04:13

Jestem szczególnie zainteresowany dodatkowymi ostrzeżeniami,

Oprócz -Wall, opcja -W lub -Wextra (-W działa zarówno ze starszymi wersjami gcc, jak i nowszymi; nowsze wersje obsługują alternatywną nazwę -Wextra, która oznacza to samo, ale jest bardziej opisowa) włącza różne dodatkowe Ostrzeżenia.

Jest jeszcze więcej ostrzeżeń, które nie są włączane przez żadne z nich, ogólnie dla rzeczy, które są bardziej wątpliwie złe. Na zestaw dostępnych opcji zależy od używanej wersji gcc - sprawdź man gcc lub info gcc Po szczegóły lub zobacz Online documentation dla konkretnej wersji gcc, którą jesteś zainteresowany. I -pedantic wystawia wszystkie ostrzeżenia wymagane przez dany używany standard (co zależy od innych opcji, takich jak -std=xxx lub -ansi) i narzeka na użycie rozszerzeń gcc.

I/lub zamienianie ostrzeżeń w Błędy w niektórych przypadkach, aby absolutnie zminimalizować przypadkowe Typ niedopasowania.

-Werror zamienia wszystkie ostrzeżenia W błędy. Nie sądzę, że gcc pozwala to zrobić selektywnie dla poszczególnych ostrzeżeń, choć.

Prawdopodobnie okaże się, że musisz być selektywny co do tego, które ostrzeżenia są włączone w zależności od projektu (szczególnie jeśli używasz -Werror), Ponieważ pliki nagłówkowe z zewnętrznych bibliotek mogą potknąć się niektóre z nich. (-pedantic w szczególności wydaje się być nieprzydatne w tym względzie, z mojego doświadczenia.)

 2
Author: Matthew Slattery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 23:48:53
  • -Wmissing-prototypes: jeśli funkcja globalna jest zdefiniowana bez wcześniejszej deklaracji prototypu.
  • -Wformat-security: ostrzega o użyciu funkcji formatowania, które reprezentują możliwe problemy z bezpieczeństwem. Obecnie ostrzega to o wywołaniach funkcji printf i scanf, w których łańcuch formatowania nie jest literalnym łańcuchem znaków i nie ma argumentów formatowania
 0
Author: Praveen Handigol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 18:11:53