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.

Author: James Thompson, 2009-01-29

7 answers

Poza pedantycznym błędem, który sugerowali inni, IMO, zawsze dobrze jest uruchomić lint jako część procesu kompilacji.

Istnieją pewne narzędzia:

Zaoszczędzą dużo twojego czasu.

 8
Author: KOkon,
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.

 3
Author: codelogic,
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) .

 3
Author: Eugene Yokota,
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

 3
Author: Validus Oculus,
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.)

 2
Author: CB Bailey,
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.

 1
Author: Dmitry Khalatov,
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/

 1
Author: Shital Shah,
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