jacking75 님이 너무 예쁘게 만들어 주신 내용이 있어서, 나중에 기록을 해 놓을 용으로 옮겨 놓는다.
원본: https://qiita.com/janus_wel/items/07140fcd1127b568087d
C++11 - C++11용 gcc 옵션
옵션 | 효과 |
---|---|
-std = c ++ 11 | 대상 소스가 C++ 11 기준으로 컴파일 |
-Wall | 기본 경고 옵션을 on으로 한다 |
-Wextra | 추가 경고 옵션을 on으로 한다 |
-pedantic | ISO C/C++에 존재하지 않는 문법 경고 |
-Wcast-align | char* 에서 int* 같은 정렬 길이가 커지는 캐스트 경고 |
-Wcast-qual | const char *을 char *로 캐스팅 하는 등 형식 한정자를 벗어나는 경우에 경고 |
-Wconversion | 암시적 캐스트 및 형식 변환이 실시된다고 경고 |
-Wdisabled-optimization | 컴파일시 최적화가 도중에 중단된다고 경고 |
-Wendif-labels | #else FOO와 #endif FOO 등 주석을 달아야할 위치에 식별자가 있다고 경고한다 |
-Wfloat-equal | 부동 소수점 숫자를 == 로 비교하고 있다고 경고한다 |
-Winit-self | int i = i; 같은 정의되지 않은 변수가 자신을 초기화 하면 경고 |
-Winline | inline 지정된 함수가 인라인 되지 않은 경우에 경고 |
-Wlogical-op | 비트 연산자가 맞는 곳에 논리 연산자를 이용한 경우에 경고 |
-Wmissing-include-dirs | 사용자가 지정한 include 디렉토리가 존재하지 않는 경우에 경고 |
-Wnon-virtual-dtor | 가상 함수를 가지고 있는 비 가상 소멸자를 가진 클래스를 정의하면 경고 |
-Wold-style-cast | C 언어 형식의 캐스팅을 경고한다 |
-Woverloaded-virtual | 부모 클래스의 가상 멤버 함수를 가려 버리는 멤버 함수를 정의하면 경고 |
-Wpacked | packed attribute이 구조체나 클래스에 지정 되어 있지만, 지정되지 않은 경우와 크기가 바뀌지 않을 경우에 경고 |
-Wpointer-arith | 함수형이나 void 포인터, NULL에 대한 수치 계산을 하면 경고 |
-Wredundant-decls | 같은 범위에서 동일한 기호를 여러 번 선언 하면 경고 |
-Wshadow | 로컬 변수와 형식 선언이 다른 변수, 매개 변수, 타입, 클래스 멤버 내장 함수를 숨기면 경고한다 |
-Wsign-promo | 오버로드 해결 시 unsigned / 열거 타입에서 동일한 크기의 unsigned를 통해 signed로 승격하면 경고 |
-Wswitch-default | switch 문에 default case가 없으면 경고 |
-Wswitch-enum | 열거 타입의 case를 가지는 switch 문에서 이 열거 타입 중 하나 이상의 값이 case로 정의되어 있지 않으면 default case가 있어도 경고 |
-Wunsafe-loop-optimizations | 종료 조건을 가정 할 수 없고 루프를 최적화 할 수 없는 경우에 경고 |
-Wvariadic-macros | 가변 인자 매크로가 ISO C90 모드에서 사용되면 경고 |
-Wwrite-strings | 문자열 리터럴 형식 const char을 char로 변환하면 경고 |
##
-Wall 내역
옵션 | 효과 |
---|---|
-Waddress | 함수 포인터를 조건식에 사용하는 등 이상한 포인터 사용을 경고한다 |
-Warray-bounds | 배열에 범위를 벗어난 첨자 지정을 한 경우 경고 -O2와 동시에 지정된 경우에만 유효 |
-Wc++11-compat | ISO C++ 1998에서 ISO C++ 2011까지와 다른 소스의 경우에 경고 |
-Wchar-subscripts | 배열의 첨자를 char 타입으로 지정한 경우에 경고 |
-Wenum-compare | 다른 열거 타입 값끼리 비교 한 경우에 경고 |
-Wcomment | /가 / 주석에 나타난 경우 백 슬래시가 // 주석의 마지막에 나타날 경우 경고 |
-Wformat | printf 같은 형식의 서식 지정 순서에 변수 인수와 수가 다르거나 적절하게 변환 할 수 없는 경우에 경고 |
-Wmaybe-uninitialized | 자동 변수가 초기화 되지 않는 루트가 있는 경우에 경고 |
-Wmissing-braces | int a[2][2] = {0, 1, 2, 3}; 등 집계나 공용체의 초기화에 괄호를 생력하면 경고 |
-Wnonnull | nonnull 속성이 붙은 함수에 null 포인터를 전달하면 경고 |
-Wparentheses | 중첩 된 if 문에서 else 등 괄호가 없으면 혼란스러운 맥락에서 괄호를 생략하면 경고 |
-Wreorder | 멤버 이니셜 라이저 순서가 선언과 다른 경우 경고 |
-Wreturn-type | 함수의 반환 형식이 지정되어 있는데 값 없는 return을 하는 등 return 관한 이상한 코드 경고 |
-Wsequence-point | n = n++; 등 평가 순서에 따라 결과가 달라질 코드 경고 |
-Wsign-compare | singed 타입과 unsigned 타입의 비교에서 singed 타입을 unsigned 타입으로 변환하면 결과가 이상 해지는 코드 경고 |
-Wstrict-aliasing | int x = 0; short* y = (short *)&x; 등 무리한 형식 변환에 의해 컴파일러가 최적화 할 수 없는 경우에 경고 |
-Wstrict-overflow = 1 | 부호있는 오버플로가 발생하지 않는다고 가정한 최적화가 실시된다고 경고 |
-Wswitch-enum | 열거 타입의 case를 가지는 switch 문에서 이 열거 타입 중 하나 이상의 값이 case로 정의되어 있지 않다면 경고. default case가 있으면 ok |
-Wtrigraphs | 프로그램의 의미를 바꿀 수 있는 트라이 그래프가 코드에 포함 되어 있다고 경고한다 |
-Wuninitialized | 비 static 참조 및 비 static const 멤버 변수를 생성자가 없는 클래스에 정의되어 있다고 경고한다 |
-Wunknown-pragmas | gcc가 인지하지 못하는 #pragma 지시어가 존재하는 경우에 경고 |
-Wunused-function | static 함수를 선언하고 정의 되어 있지 않거나 비 inline의 static 함수가 사용되지 않은 경우에 경고 |
-Wunused-label | 사용되지 않는 레이블이 있다고 경고한다 |
-Wunused-value | i = (1, 2, 3); 같은 결과를 계산하는 글이 명시적으로 사용되지 않은 경우에 경고 |
-Wunused-variable | 로컬 변수와 비 const의 static 변수가 선언되어 있지만 사용되지 않은 경우에 경고 |
-Wvolatile-register-var | 레지스터 변수가 volatile 수식하는 경우에 경고 |
-Wextra 내역
옵션 | 효과 |
---|---|
-Wclobbered | longjmp와 vfork에 의해 변수가 변경 될지도 모르는 경우에 경고 |
-Wempty-body | if, else, do while 문장의 본체가 없는 경우 경고 |
-Wignored-qualifiers | const int a(); 같은 함수의 반환 형식이 const 등의 형태 수식자를 가지는 경우에 경고 |
-Wmissing-field-initializers | 정의된 필드 수에 비해 구조체 이니셜 라이저의 수가 적은 경우에 경고 |
-Wsign-compare | singed 타입과 unsigned 타입의 비교에서 singed 타입을 unsigned 타입으로 변환하면 결과가 이상 해지는 코드 경고 |
-Wtype-limits | unsigned int a; if (a <0) 과 같이 데이터 타입의 범위가 한정되어 있기 때문에 비교가 항상 참 또는 거짓이 되는 경우에 경고 |
-Wuninitialized | 비 static 참조 및 비 static const 멤버 변수를 생성자가 없는 클래스에 정의되어 있다고 경고한다 |
-Wunused-parameter | 함수 인수가 정의되어 있지만 사용되지 않은 경우에 경고 |
-Wunused-but-set-parameter | 함수에 인수가 전달되고 있지만 사용되어 있지 않은 경우에 경고 |
다음의 경우도 경고
- 포인터를 정수 값 0과 아래 비교 연산자로 비교한 경우
<
<=
>
>=
- 열거 값과 비 열거 값이 조건식에 동시에 나타난 경우
- 애매한 가상 기본 클래스
- register와 함께 선언된 배열 첨자 지정
- register 함께 선언된 변수의 포인터 취득
- 상속된 클래스에서 기본 클래스가 초기화 되어 있지 않은 경우