setting -Wall
과 setting 외에도 -std=XXX
C에서 사용하기에 실제로 유용하지만 덜 알려진 컴파일러 플래그는 무엇입니까?
특히 추가 경고에 관심이 있으며 우발적 인 유형 불일치를 최소화하기 위해 경고를 오류로 전환하는 경우가 있습니다.
답변
몇 가지 -f
코드 생성 옵션이 흥미 롭습니다.
-
이
-ftrapv
함수는 프로그램이 부호있는 정수 오버 플로우 (공식적으로 C에서 “정의되지 않은 동작”)에서 중단되도록합니다. -
-fverbose-asm
-S
어셈블리 출력을 검사하기 위해 컴파일 할 때 유용합니다 . 유익한 주석이 추가됩니다. -
-finstrument-functions
모든 기능 시작 및 종료 지점에서 사용자 제공 프로파일 링 함수를 호출하는 코드를 추가합니다.
답변
여기 내 것이 있습니다 :
-Wextra
,-Wall
: 필수.-Wfloat-equal
: 일반적으로 부동 소수점 숫자가 동일한 지 테스트하는 것이 좋지 않기 때문에 유용합니다.-Wundef
:#if
지시문 에서 초기화되지 않은 식별자가 평가되면 경고합니다 .-Wshadow
: 지역 변수가 다른 지역 변수, 매개 변수 또는 전역 변수를 가리거나 내장 함수가 그림자 될 때마다 경고합니다.-Wpointer-arith
: 함수 크기 또는 크기에 따라 달라지는 경우 경고합니다void
.-Wcast-align
: 대상의 필요한 정렬이 증가하도록 포인터를 캐스트 할 때마다 경고합니다. 예를 들어 정수가 2 바이트 또는 4 바이트 경계에서만 액세스 할 수있는 컴퓨터에서 achar *
가 캐스팅 된 경우 경고합니다int *
.-Wstrict-prototypes
: 인수 유형을 지정하지 않고 함수가 선언되거나 정의되면 경고합니다.-Wstrict-overflow=5
: 부호있는 오버플로가 발생하지 않는다는 가정에 따라 컴파일러가 최적화되는 경우에 대해 경고합니다. (값 5가 너무 엄격 할 수 있습니다. 매뉴얼 페이지를 참조하십시오.)-Wwrite-strings
: 문자열 상수에const char[
길이를]
지정하여 주소의 주소를 비const char *
포인터에 복사하면 경고가 표시됩니다.-Waggregate-return
: 구조체 나 공용체를 반환하는 함수가 정의되거나 호출되면 경고합니다.-Wcast-qual
: 대상 유형 * 에서 유형 한정자를 제거하기 위해 포인터를 캐스트 할 때마다 경고 합니다.-Wswitch-default
:switch
문장에default
대소 문자 가 없을 때마다 경고합니다 * .-Wswitch-enum
:switch
명령문에 열거 된 유형의 색인이 있고case
해당 열거의 명명 된 코드 중 하나 이상에 대해 a가 없을 때 경고합니다 * .-Wconversion
: 값을 변경할 수있는 암시 적 변환에 대해 경고합니다 * .-Wunreachable-code
: 컴파일러에서 해당 코드가 실행되지 않음을 감지하면 경고합니다 * .
* 표시가있는 사람들은 때때로 너무 많은 가짜 경고를하므로 필요에 따라 사용합니다.
답변
항상 사용 -O
이상 ( -O1
, -O2
, -Os
, 등). 기본 최적화 수준에서 gcc는 컴파일 속도를 결정하고 단위 변수와 같은 것에 대해 경고하기에 충분한 분석을 수행하지 않습니다.
-Werror
컴파일을 중지하지 않는 경고는 무시되는 경향이 있으므로 정책을 고려하십시오 .
-Wall
오류 일 가능성이 높은 경고를 거의 설정합니다.
포함 된 경고는 -Wextra
일반적인 합법적 인 코드를 표시하는 경향이 있습니다. 코드 검토에 유용 할 수 있지만 (보풀이 많은 프로그램은 더 많은 함정이 더 유연하다는 것을 알지만) 정상적인 개발을 위해 설정하지는 않습니다.
-Wfloat-equal
프로젝트의 개발자가 부동 소수점에 익숙하지 않은 경우 좋은 아이디어이고 그렇지 않은 경우 나쁜 아이디어입니다.
-Winit-self
유용하다; 에 포함되지 않은 이유가 궁금합니다 -Wuninitialized
.
-Wpointer-arith
와 호환되지 않는 대부분 이식 가능한 코드가있는 경우 유용합니다 -pedantic
.
답변
-save-temps
이것은 전 처리기 및 어셈블리의 결과를 남깁니다.
사전 처리 된 소스는 매크로 디버깅에 유용합니다.
이 어셈블리는 어떤 최적화가 적용되었는지 확인하는 데 유용합니다. 예를 들어 GCC가 일부 재귀 함수에서 테일 콜 최적화를 수행하고 있는지 확인할 수 있습니다. 그렇지 않으면 스택 오버플로가 발생할 수 있습니다.
답변
아무도 이것에 대해 아직 말하지 않은 것에 놀랐습니다. 내가 염려하는 한 가장 유용한 플래그는 -g
디버깅 정보를 실행 파일에 넣어 디버깅하고 소스를 단계별로 실행할 수있는 것입니다. 등 stepi
프로그램의 명령)이 실행하는 것 동안.
답변
-fmudflap -UB를 잡기 위해 모든 위험한 포인터 작업에 런타임 검사를 추가합니다. 이를 통해 프로그램이 버퍼 오버플로를 다시 효과적으로 예방하고 모든 종류의 매달려있는 포인터를 잡을 수 있습니다.
데모는 다음과 같습니다.
$ cat mf.c
int main()
{
int a[10];
a[10]=1; // <-- o noes, line 4
}
$ gcc -fmudflap mf.c -lmudflap
$ ./a.out
*******
mudflap violation 1 (check/write): time=1280862302.170759 ptr=0x7fff96eb3d00 size=44
pc=0x7f3a575503c1 location=`mf.c:4:2 (main)'
/usr/lib/libmudflap.so.0(__mf_check+0x41) [0x7f3a575503c1]
./a.out(main+0x90) [0x400a54]
/lib/libc.so.6(__libc_start_main+0xfd) [0x7f3a571e2c4d]
Nearby object 1: checked region begins 0B into and ends 4B after
mudflap object 0xf9c560: name=`mf.c:3:6 (main) a'
bounds=[0x7fff96eb3d00,0x7fff96eb3d27] size=40 area=stack check=0r/3w liveness=3
alloc time=1280862302.170749 pc=0x7f3a57550cb1
number of nearby objects: 1
답변
실제로 C / C ++와 관련이 없지만 어쨌든 유용합니다.
@file
위의 모든 좋은 플래그 (모두 지정한)를 ‘file’에 넣고 위의 플래그를 사용하여 해당 파일의 모든 플래그를 함께 사용하십시오.
예 :
파일 : compilerFlags
-벽
-std = c99
-엑스트라
그런 다음 컴파일하십시오.
gcc yourSourceFile @compilerFlags