-Wall 이외에 사람들이 유용하다고 생각한 다른 경고는 무엇입니까?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
-Wall 이외에 사람들이 유용하다고 생각한 다른 경고는 무엇입니까?
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html
답변:
나는 일상적으로 다음을 사용합니다.
gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
-Wstrict-prototypes -Wmissing-prototypes
이 세트는 익숙하지 않은 사람들 (처음으로 해당 플래그로 코드를 컴파일하는 사람들)을 위해 많은 것을 잡습니다. 거의 문제가되지 않습니다 (-Wcast-qual은 때때로 성가신 일임).
-O3
하거나 유사한 것을 추가하는 것이 좋습니다 . 코드가 최적화 된 경우에만 생성되는 경고가 있습니다.
-m32
및 -m64
(물론 별도의 실행에서) 둘 다 사용 하면 사용 printf()
및 scaf()
변환 사양 에서 다양한 버그로부터 더 나은 보호를 제공합니다 .
2011-09-01 기준, gcc 버전 4.6.1 포함
내 현재 "개발"별칭
gcc -std = c89 -pedantic -Wall \ -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat = 2 \ -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-overflow = 5 -Wstrict-prototypes -Winline \ -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ -Wlogical-op -Wfloat-equal -Wstrict-aliasing = 2 -Wredundant-decls \ -Wold-style-definition -Werror \ -ggdb3 \ -O0 \ -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ -lm
"release"별칭
gcc -std = c89 -pedantic -O3 -DNDEBUG -flto -lm
2009-11-03 기준
"development"별칭
gcc -Wall -Wextra -Wformat = 2 -Wswitch-default -Wcast-align -Wpointer-arith \ -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ -Wstrict-aliasing = 2 -ffloat-store -fno-common -fstrict-aliasing \ -lm -std = c89 -pedantic -O0 -ggdb3 -pg-범위
"release"별칭
gcc -lm -std = c89 -pedantic -O3 -DNDEBUG -combine -fwhole-program -funroll-loops
-Wfloat-equal
내 별칭에 추가되었습니다. 감사합니다 Mark
-Wstrict-aliasing=2
경고 수준 을 실제로 낮 춥니 다 . -Wstrict-aliasing=3
-Wall
나는 -Werror를 좋아합니다. 코드 경고를 무료로 유지합니다.
#warning
을 사용하여 좋은 부작용을 제거하는 것을 고려 -Werror
합니다.
-Werror
빌드에서 기본적으로 사용하지 않는 경우 컴파일러 버전에 따라 경고가 변경되기 때문에 다른 컴파일러 버전을 사용하는 패키지 작성자가 짜증을냅니다. 그런 다음 빌드 시스템을 파헤쳐 꺼야합니다.
저는 C ++로 시작 했으므로 CI 학습으로 전환했을 때 추가 항문이 필요했습니다.
-f 메시지 길이 = 0 -ansi -pedantic -std = c99 -공포 -벽 -Wextra -Wwrite- 문자열 -Winit-self -Wcast 정렬 -Wcast-qual -Wpointer-arith -Wstrict-aliasing -Wformat = 2 -Wmissing 선언 -Wmissing-include-dirs -Wno-unused-parameter -Wuninitialized -월드 스타일 정의 -Wstrict 프로토 타입 -Wmissing 프로토 타입
사용하는 GCC 버전에 대한 설명서를 구하고 사용 가능한 모든 경고 옵션을 찾은 다음 설득력있는 이유 가있는 옵션 만 비활성화하십시오 . (예를 들어, 그렇지 않으면 많은 경고를 제공하는 수정 불가능한 타사 헤더) 이러한 이유를 문서화하십시오. (Makefile에서 또는 해당 옵션을 설정하는 곳마다.) 정기적으로 그리고 컴파일러를 업그레이드 할 때마다 설정을 검토하십시오 .
컴파일러는 당신의 친구입니다. 경고는 당신의 친구입니다. 컴파일러에게 가능한 한 잠재적 인 문제를 알려줄 수있는 많은 기회를주십시오.
또한 다음을 사용합니다.
-Wstrict-overflow = 5
정수의 오버플로 동작에 의존하는 코드를 작성하면 발생할 수 있는 불쾌한 버그를 잡기 위해 .
과:
-Wextra
좋은 옵션도 가능합니다. 대부분은 C ++ 용입니다.
저는 보통 "-W -Wall -ansi -pedantic"으로 컴파일합니다. 이것은 코드의 최대 품질과 이식성을 보장하는 데 도움이됩니다.
-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter
"Hurt me much"모드의 경우 -Wno ...
특히 C ++에서 내 코드 경고를 없애고 싶습니다. C 컴파일러 경고는 종종 무시 될 수 있지만 많은 C ++ 경고는 소스 코드의 근본적인 결함을 보여줍니다.
Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}
-> 상대적으로 찾기 어렵습니다. 이 경고에 짜증이 난다면 단순히 매개 변수를 주석 처리해야합니다. 이렇게하면 foo (int /*q*/)
코드의 가독성도 높아집니다.
-페단 틱 오류
clang
(LLVM 프로젝트의 C 컴파일러)를 시도한 다음 컴파일 -Weverything
하면 마하 컴파일이 실제로 얼마나 재미있을 수 있는지 확인할 수 있습니다 (일부 경고는 완전히 미쳤지 만 기술적으로 정확합니다).
지금은 다음을 사용합니다.
-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror
나는 그 목록을 주로 "An Introduction to gcc"라는 책에서 가져온 다음, 방어 프로그래밍에 대한 Ulrich Drepper 추천서 ( http://people.redhat.com/drepper/Defensive-slides.pdf) 에서 가져 왔습니다 . ) .
하지만 내 목록 뒤에 과학이 없습니다. 좋은 목록처럼 느껴졌습니다.
/ 조한
참고 : 나는 그 현학적 인 깃발을 좋아하지 않는다 ....
참고 : -W와 -Wextra는 거의 동일하다고 생각합니다.
나는 일반적으로
gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o
-Wfatal-errors
-Wdeclaration-after-statement
MSVC (기본적으로 C89 컴파일러)가 처리하지 못하는 코드를 감지하기 위해 ' ' 를 추가해야합니다 . '귀찮은 일입니다. '-Wextra
'를 추가하면 다른 문제도 발견 할 수 있습니다.