Uczynienie GCC i innych kompilatorów C++ bardzo surowymi
Pracuję nad dużym wspólnym projektem C++, który jest rozwijany i uruchamiany na różnych wersjach Linuksa, OS X i Windows. Kompilujemy na tych platformach za pomocą GCC, Visual Studio C++ i kompilatora Intel C++. W miarę jak coraz więcej osób zaczyna opracowywać kod do projektu, zaczynamy dostrzegać dziwne błędy w kompilacji i uruchomieniu, które są specyficzne dla poszczególnych kompilatorów na poszczególnych systemach operacyjnych. Przykładem tego jest dorozumiane włączenie nagłówków, które niektóre pary OS / kompilator wydają się znaleźć dla Ciebie, przypadkowo przeciążając funkcję z klasy bazowej w klasie pochodnej.
Moim celem jest uczynienie kompilacji na GCC bardziej rygorystycznym i wyłapanie większej liczby błędów na wszystkich platformach, abyśmy nie napotykali tych problemów. Oto moja lista flag, które zastanawiam się nad wypróbowaniem GCC, które znalazłem za pośrednictwem Google i stron podręcznika GCC:
- -Ściana
- -Wextra
- -Winit-self
- -Wold-style-cast
- - Woverloaded-virtual
- - Wuninitialized
- - Wmissing-deklaracje
- -Winit-self
- -ansi
- - pedantic
Jakie są inne flagi, które ludzie używają, aby GCC (i mniej ważne Visual Studio C++ i kompilator Intel C++) przestrzegać bardziej rygorystycznych standardów języka C++? Sprecyzuj, o którym kompilatorze i wersji mówisz, ponieważ niektóre z nich mogą nie być zaimplementowane we wszystkich wersjach wszystkich kompilatorów.
7 answers
Poza pedantycznym błędem, który sugerowali inni, IMO, zawsze dobrze jest uruchomić lint jako część procesu kompilacji.
Istnieją pewne narzędzia:
- cpplint (free)
- gimple lint
- coverity
Zaoszczędzą dużo twojego czasu.
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
2009-01-29 09:30:28
Możesz wprowadzać pedantyczne ostrzeżenia W błędy za pomocą -pedantic-errors
. Zapobiegnie to ignorowaniu go przez deweloperów. W związku z tym, można zrobić wszystkie ostrzeżenia W błędy, jak również z -Werror
, chociaż może to być przeciwne do produktywności w niektórych przypadkach(może nie w Twoim choć).
Ogólnie rzecz biorąc, myślę, że jeśli chodzi o przestrzeganie ścisłego standardu, opcje -pedantic
są najbardziej pomocne.
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
2009-01-29 07:20:53
-pedantyczne-błędy.
Zobacz więcej na gcc (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
2009-01-29 07:21:56
Skopiuj i wklej poniższą linię do pliku master cmake. poniżej znajduje się prawie większość użytecznych flag kompilatora w celu sprawdzenia się bardziej rygorystycznie.
set(CMAKE_CXX_FLAGS "-O0 -fno-elide-constructors -pedantic-errors -ansi -Wextra -Wall -Winit-self -Wold-style-cast -Woverloaded-virtual -Wuninitialized -Wmissing-declarations -Winit-self -std=c++98")
Jeśli nie używasz cmake po prostu skopiuj flagi, które w cudzysłowach i wyślij do 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
2013-12-19 07:04:46
Jak również -pendantic
należy również podać Przełącznik -std
. Jeśli potrzebujesz bardziej rygorystycznej kompilacji, powinieneś wiedzieć, do Jakiego standardu próbujesz się dostosować. Zazwyczaj dla obecnego c++ będzie to -std=c++98
. ( -ansi
wykonuje podobną funkcję w trybie C++, ale -std=
jest bardziej Jawna.)
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
2009-01-29 07:42:55
W podobnej sytuacji zrezygnowaliśmy i przenieśliśmy się do Ace framework , ukrywając różnicę między platformami.
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
2009-01-29 07:21:24
Napisałem post na blogu na ten temat po zbadaniu kilku opcji. Musisz również obsługiwać przypadki, w których używasz innych bibliotek, ale nie są one zgodne ze ścisłą kompilacją. Na szczęście istnieje również łatwy sposób na ich obsługę. Używam tego szeroko we wszystkich moich projektach.
W skrócie, użyj następujących opcji kompilatora, aby włączyć bardzo ścisły tryb (poniżej jest to, co umieściłem w CMakeLists.txt):
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -Wstrict-aliasing -pedantic -fmax-errors=5 -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option ${CMAKE_CXX_FLAGS}")
Możesz przeczytać więcej o tym, jak włączyć i off this strict mode for specific parts of code here: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/
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-07-11 23:48:30