C에 대한 권장 gcc 경고 옵션 [닫힘]


83

-Wall 이외에 사람들이 유용하다고 생각한 다른 경고는 무엇입니까?

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Warning-Options.html

답변:


48

나는 일상적으로 다음을 사용합니다.

    gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \
        -Wstrict-prototypes -Wmissing-prototypes

이 세트는 익숙하지 않은 사람들 (처음으로 해당 플래그로 코드를 컴파일하는 사람들)을 위해 많은 것을 잡습니다. 거의 문제가되지 않습니다 (-Wcast-qual은 때때로 성가신 일임).


1
요즘에는 -Wdeclaration-after-statementMSVC (기본적으로 C89 컴파일러)가 처리하지 못하는 코드를 감지하기 위해 ' ' 를 추가해야합니다 . '귀찮은 일입니다. ' -Wextra'를 추가하면 다른 문제도 발견 할 수 있습니다.
Jonathan Leffler

2
또한 추가 -O3하거나 유사한 것을 추가하는 것이 좋습니다 . 코드가 최적화 된 경우에만 생성되는 경고가 있습니다.
조나단 레플러

3
gcc doc에 따르면 -O2는 경고를 발견하는 데 가장 적합합니다. -O3가 -O2를 의미하는지 또는 더 많은 경고가 생성되도록 허용하는지 잘 모르겠습니다.
Offirmo

3
64 비트 환경이 아닌 경우 -m64를 건너 뜁니다.
Tor Klingberg 2013

1
-m32 -m64 (물론 별도의 실행에서) 둘 다 사용 하면 사용 printf()scaf()변환 사양 에서 다양한 버그로부터 더 나은 보호를 제공합니다 .
Jonathan Leffler 2014 년

40

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

1
-Wfloat-equal내 별칭에 추가되었습니다. 감사합니다 Mark
pmg

4
최소한 최신 버전의 gcc에서는에 의해 암시 된 -Wstrict-aliasing=2경고 수준 을 실제로 낮 춥니 다 . -Wstrict-aliasing=3-Wall
nwellnhof

15

나는 -Werror를 좋아합니다. 코드 경고를 무료로 유지합니다.


21
-Werror없이 다른 모든 경고 옵션은 무의미합니다. 경고를 오류로 처리하는 것이 경고가 해결되도록하는 유일한 방법입니다. 단지 경고 일 뿐이라면 개발자는 그것이 유효하지 않다고 확신하기 때문에 하나를 남겨두기로 결정할 수 있습니다. 사실 일 수도 있지만 다음 개발자는 다른 모든 사용자간에 경고를 보지 못했기 때문에 또는 경고가 하나 더 추가 되었기 때문에 자신이 도입 한 경고를 수정하지 않을 것입니다.
Kristof Provost

6
나는 Kristof의 의견에 동의하지 않습니다. 왜냐하면 저는 여러 번 작업 복사본을 먼저 컴파일 한 다음 오류 해결하기를 원하기 때문입니다.
Yktula 2010

9
나는 그것이 왜 유혹적인지 ​​이해합니다. 그러나 당신이 작업용 카피를 가지고 있다면 당신은 "효과가 있기"때문에 그대로 남겨 둘 가능성이 더 큽니다. 이 위험은 경고를 수정하기 위해 시간을 내도록 상사를 설득해야하는 기업 환경에서 훨씬 더 높습니다.
JesperE

2
#warning을 사용하여 좋은 부작용을 제거하는 것을 고려 -Werror합니다.
JesperE

3
오픈 소스에서 작업하는 경우 -Werror빌드에서 기본적으로 사용하지 않는 경우 컴파일러 버전에 따라 경고가 변경되기 때문에 다른 컴파일러 버전을 사용하는 패키지 작성자가 짜증을냅니다. 그런 다음 빌드 시스템을 파헤쳐 꺼야합니다.
Spudd86

15

저는 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 프로토 타입

5
-ansi -pedantic -std = c99를 동시에 사용할 수 있습니까? -ansi는 c89와 거의 같지 않습니까? 그렇다면 c99 플래그와 어떻게 작동합니까?
Johan

2
@Johan-내가 더 최근에 알게 된 것처럼 실제로는 필요하지 않습니다. -ansi는 -std = <default>를 의미하므로 실제로 -std = c99 -pedantic이라고 말하면 똑같은 효과를 얻을 수 있습니다. 나는 문서화 효과를 위해 어쨌든 그것을 사용하는 경향이 있습니다. "이 코드는 표준 C99를 사용하는 ANSI 표준 (pedantic!)입니다."라고 읽습니다. 그 직후 일반적으로 -Wno-long-long 또는 유사 ... ANSI 표준에 대한 예외가 있습니다.

9

사용하는 GCC 버전에 대한 설명서를 구하고 사용 가능한 모든 경고 옵션을 찾은 다음 설득력있는 이유 가있는 옵션 비활성화하십시오 . (예를 들어, 그렇지 않으면 많은 경고를 제공하는 수정 불가능한 타사 헤더) 이러한 이유를 문서화하십시오. (Makefile에서 또는 해당 옵션을 설정하는 곳마다.) 정기적으로 그리고 컴파일러를 업그레이드 할 때마다 설정을 검토하십시오 .

컴파일러는 당신의 친구입니다. 경고는 당신의 친구입니다. 컴파일러에게 가능한 한 잠재적 인 문제를 알려줄 수있는 많은 기회를주십시오.


1
참고로이 매뉴얼은 경고의 포괄적 인 단일 목록을 제공하지 않습니다. 그러나 이러한 목록 을 생성하는 데 사용되는 도구와 함께 여기 에서 찾을 수 있습니다.
Kyle Strand

5

또한 다음을 사용합니다.

-Wstrict-overflow = 5

정수의 오버플로 동작에 의존하는 코드를 작성하면 발생할 있는 불쾌한 버그를 잡기 위해 .

과:

-Wextra

좋은 옵션도 가능합니다. 대부분은 C ++ 용입니다.


4
-Wextra가 -W의 새 이름 인 것 같습니다 (아직도 지원됨)
Sard

2

저는 보통 "-W -Wall -ansi -pedantic"으로 컴파일합니다. 이것은 코드의 최대 품질과 이식성을 보장하는 데 도움이됩니다.


3
-ansi는 -std = c99를 재정의합니다.
Sard

2
-ansi는 -std = c89를 사용하는 것과 동일하지 않습니까?
helpermethod 2010

2

-pedantic -Wall -Wextra -Wno-write-strings -Wno-unused-parameter

"Hurt me much"모드의 경우 -Wno ...

특히 C ++에서 내 코드 경고를 없애고 싶습니다. C 컴파일러 경고는 종종 무시 될 수 있지만 많은 C ++ 경고는 소스 코드의 근본적인 결함을 보여줍니다.


3
툴체인은 문자열 리터럴을 읽기 전용 메모리에 자유롭게 넣을 수 있기 때문입니다.
DevSolar 2010-07-05

3
-Wno-unused-parameter가 필요한 이유 매우 드물게 실제 문제를 가리키고 있습니다 (그리고이를 비활성화하는 정확한 위험은 "매우 드물게"발생합니다. 가능성이없는 버그는 감지하기에 최악입니다). 예를 들어, 트리거 할 수있는 경우 Foo(int dndu, int dndv) : dndu_(dndu), dndv_(dndu) {}-> 상대적으로 찾기 어렵습니다. 이 경고에 짜증이 난다면 단순히 매개 변수를 주석 처리해야합니다. 이렇게하면 foo (int /*q*/)코드의 가독성도 높아집니다.
Sebastian Mach

리팩토링하는 동안 가끔 실수로 로컬에서 매개 변수를 섀도 잉했습니다.이 역시이를 포착하는 데 도움이됩니다
paulm

1

-페단 틱 오류


2
@unexist 설치 clang(LLVM 프로젝트의 C 컴파일러)를 시도한 다음 컴파일 -Weverything하면 마하 컴파일이 실제로 얼마나 재미있을 수 있는지 확인할 수 있습니다 (일부 경고는 완전히 미쳤지 만 기술적으로 정확합니다).
Mecki 2013


1

-Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wextra -Werror-implicit-function-declaration -Wunused -Wno-unused-value -Wreturn-type


1

지금은 다음을 사용합니다.

-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는 거의 동일하다고 생각합니다.


2
-Wconversion을 사용하고 내 코드에서 다양한 데이터 유형을 테스트하고 다시 빌드하는 데 몇 시간을 소비하면서 -Wconversion을 조사했으며 일반적으로 사용하지 않는 것이 좋습니다. 문제는 다음과 같은 코드에 대한 경고를 생성한다는 것입니다. char a = 5; char b = a-1; 이것은 gcc 4.3.2 (Debian 4.3.2.-1.1)를 사용하고 있습니다
James Morris

1
-Wconversion 경고는 다음과 같이 제거 할 수 있습니다 (예 : 위 주석). char a = 5; char b = (char) (a-1); 참고 괄호.
James Morris

1

나는 일반적으로

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

1

초기화되지 않은 변수에 대한 경고는를 지정하지 않으면 작동하지 않으므로 -O목록에 포함합니다.

-g -O -Wall -Werror -Wextra -pedantic -std=c99

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.