gcc 컴파일 옵션으로 많이 사용하는 -Wall , -Wextra 이외에 다양한 옵션들은 정리하고자 합니다.
옵션 | 설명 | 특이사항 |
---|---|---|
-fstack-usage | 컴파일러가 프로그램에 대한 스택 사용 정보를 함수 단위로 출력하도록 합니다. 함수의 이름, 바이트 수 등이 표기됩니다. | x |
-Wframe-larger-than={len} | 함수 프레임의 크기가 len을 넘어가면 Warning이 출력합니다. | x |
-Wstrict-overflow=n | -fstrict-overflow가 활성화 되어있는 경우에만 활성화됩니다. 컴파일러가 signed 오버플로우가 일어나지 않을거라 가정하고 최적화를 진행하는 경우에 Warning이 발생합니다. | Wall에 포함 (-Wstrict-overflow=1) |
-Wlogical-op | 표현식에서 논리연산자의 사용에 대해 문제가 발생할 수 있는 경우 Warning을 발생합니다. | x |
-Wjump-misses-init | goto문을 통해 변수 초기화 이전으로 분기하거나, 변수가 초기화된 이후로 분기하는 것을 Warning이 발생합니다. | C, Objective-C only |
-Wmissing-include-dirs | 사용자 제공 include 디렉토리가 존재하지 않으면 Warning이 발생합니다. | C/C++, Obj C/C++ only |
-Wunused | 여러 unused 옵션(unused-but-set-parament, unused-but-set-variable, unused-function, unused-label, unused-local-typedefs, unused-parameter, -no-unused-result, unused-variable, unused-value)을 한 번에 포함하는 옵션입니다. 사용되지 않는 함수 매개 변수에 대한 경고를 얻으려면 -Wextra -Wunused (-Wall implies -Wunused)를 지정하거나 -Wunused-parameter를 별도로 지정해야합니다 | Wall에 -Wunused-function -Wunused-label -Wunused-value -Wunused-variable 옵션이 포함되어 있습니다. |
-Wpacked-bitfield-compat | 4.1, 4.2 및 4.3 계열의 GCC는 “char"유형의 비트 필드에서 “packed"속성을 무시합니다. GCC 4.4에서 그러한 필드의 오프셋이 변경되면 GCC에서 알려줍니다. | Default enable |
-Winvalid-pch | precompile된 헤더가 검색 경로에서 찾았으나 사용하지 못하는 경우 Warning이 발생합니다. | - |
-Wstack-protector | Stack smashing으로부터 보호되지 않는 경우 Warning이 발생합니다. Stack smashing protector(SSP) 기능은 -fstack-protector 옵션을 사용해야 합니다. SSP 는 함수 진입 시 스택에 return address와 frame pointer 정보를 저장할 때 이 정보를 보호하기 위해 (canary라고 부르는) 특정한 값을 기록해두고 함수에서 반환할 때 기록된 값이 변경되지 않았는지 검사하여 정보의 일관성을 관리합니다. 만약 악의적인 사용자가 buffer overflow 등의 공격을 통해 스택 내의 정보를 덮어쓰려면 canary 값을 먼저 덮어써야 하기 때문에 canary 값 만 보면 공격이 일어났는지를 알 수 있습니다. | -fstack-proctector가 활성화 된 경우 활성화 됩니다. |
-Wunused-variable | 지역변수 또는 상수가아닌 정적변수가 사용되지 않을 때 Warning이 발생합니다. | -Wunused , -Wall에 포함 |
-Wunused-value | 명시적으로 사용되지 않은 결과를 계산하는 경우 Warning이 발생합니다. | -Wunused , -Wall에 포함 |
-Wcast-qual | 포인터를 형변환 할 때 기존 type qualifier가 사라지는 경우 경고해줍니다(const char_을 char_로 형변환) | - |
-Wconversion | 묵시적으로 타입을 변환하는 상황에서 값이 바뀔 가능성이 있는 경우 경고해줍니다(int temp = 0.3 등) | - |
-Wsign-conversion | 부호있는 정수 표현식을 부호없는 정수 변수에 할당하는 것과 같이 정수 값의 부호를 변경할 수있는 변환에 대해 Warning이 발생합니다. | -Wconversion 옵션에 의해 활성화됩니다. |
-Wbad-function-cast | 함수 콜이 매칭할 수 없는 타입에 캐스팅된 경우 Warning이 발생합니다. | - |
-Wwrite-strings | constant 스트링을 non-const char* 포인터에 복사하는 경우 Warning이 발생합니다. 컴파일 타임에 const string을 변경하려는 문제를 찾을 수 있습니다. | - |
-Wconversion-null | NULL 과 non-pointer 타입간의 변환에 대해 Warning이 발생합니다. | Default enable |
-Wextra | -Wall에 의해 활성화되지 않는 추가적인 Warning flags(-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init -Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall))를 활성화합니다. | - |
-Wpacked | 구조체에 packed 속성이 주어졌으나, 해당 레이아웃이나 크기에 영향이 없는 경우 Warning이 발생합니다. 이런 구조체는 아주 작은 이득을 위해 잘못 정렬될 수도 있습니다. | - |
-Wredundant-decls | 유효범위 내에 동일한 오브젝트(변수 등)이 여러 번 선언된 경우 Warning이 발생합니다. | - |
-Waggregate-return | 구조체 또는 공용체를 반환하는 함수를 선언하거나 호출 시 Warning이 발생합니다. | 거의 사용하지 않는 Warning.. ANSI C 표준에 맞추기 위해 사용하나.. 흠, |
-Wpointer-arith | void의 크기나 함수의 크기를 갖고 연산(+/- 등)을 하는 경우 Warning이 발생합니다. | - |
-Wswitch-default | switch 문에서 default case가 존재하지 않는 경우 Warning이 발생합니다. | - |
-Wundef | 정의되지 않는 식별자가 #if, #endif 구문에서 사용된 경우 Warning이 발생합니다 | - |
-Wstrict-prototype | 함수가 인자 형을 명시하지 않고 선언, 정의된 경우 Warning이 발생합니다. 즉, void test()와 같이 ()로 인자를 비워둔 경우 발생합니다. | - |
-Wfloat-equal | 부동소수점 값이 ==, != 등의 등호로 비교된 경우 Warning이 발생합니다. | - |
-Wformat-y2k | 2자리 연도를 출력하는 strftime()에 대해 Warning이 발생합니다. | - |
-Wshift-count-overflow | Shift 연산이 타입의 크기와 같거나 큰 경우 Warning이 발생합니다. | Default enable |
-Wswitch-bool | switch문이 boolean 타입의 인덱스를 가지는 경우 Warning이 발생합니다. | |
-Wno-conversion-null | NULL과 non-pointer 타입 간의 변환에 대해 Warning이 발생하지 않도록 합니다. | -Wconversion-null이 Default입니다. |
-Wnested-externs | extern 선언이 함수 안에 존재하는 경우 Warning이 발생합니다. | - |
-Wvarargs | va_start와 같은 가변인자를 처리하는데 사용된 매크로의 의심스러운 사용에 대해 Warning이 발생합니다. | Default enable |
-Wunsuffixed-float-constants | 접미사가 없는 부동상수에 대해 Warning이 발생합니다. | - |
-Wswitch-enum | switch문에서 index로 enum을 사용한 경우에 enum의 멤버와 case의 수가 맞지 않을 때 Warning이 발생합니다. | - |
-Wshadow | 지역변수가 다른 지역변수, 매개변수 등(shadow) 덮는 경우 Warning이 발생합니다. | |
-Wunreachable-code | 어떠한 경우에도 실행할 수 없는 코드 라인이 존재하는 경우 Warning이 발생합니다. | gcc 4.4 이상에서 제거됨 |
-Winline | inline으로 선언된 함수가 inline이 불가능 경우 Warning이 발생합니다. | |
-funroll-loops | for()와 같은 루프문을 풀어서 최적화 해주는 옵션으로, 코드를 크게 만들어주며 수행속도가 빨라질수도 아닐수도 있습니다. |
감사합니다.