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.
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.
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 lubvoid
. -
-Wcast-align
: Ostrzegaj, gdy wskaźnik zostanie rzucony, tak aby wymagane wyrównanie celu zostało zwiększone. Na przykład, ostrzegaj, jeślichar *
jest rzucana doint *
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 typuconst 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, gdyswitch
wypowiedź nie madefault
case*. -
-Wswitch-enum
: Ostrzegaj, gdyswitch
deklaracja ma indeks typu wyliczeniowego i nie macase
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.
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
.
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.
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.
-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
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
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
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 -
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ę.
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:
- kompilator C++ czasami daje mi lepsze komunikaty ostrzegawcze niż kompilator C.
- 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.
- 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").
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
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.
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.
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.
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.
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
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...
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 doprintf
iscanf
, 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. ;)
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
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.
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.)
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 funkcjiprintf
iscanf
, w których łańcuch formatowania nie jest literalnym łańcuchem znaków i nie ma argumentów formatowania
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