C에 유용한 GCC 플래그 유용하지만 덜 알려진 컴파일러 플래그는 무엇입니까? 특히

setting -Wall과 setting 외에도 -std=XXXC에서 사용하기에 실제로 유용하지만 덜 알려진 컴파일러 플래그는 무엇입니까?

특히 추가 경고에 관심이 있으며 우발적 인 유형 불일치를 최소화하기 위해 경고를 오류로 전환하는 경우가 있습니다.



답변

몇 가지 -f코드 생성 옵션이 흥미 롭습니다.

  • -ftrapv함수는 프로그램이 부호있는 정수 오버 플로우 (공식적으로 C에서 “정의되지 않은 동작”)에서 중단되도록합니다.

  • -fverbose-asm-S어셈블리 출력을 검사하기 위해 컴파일 할 때 유용합니다 . 유익한 주석이 추가됩니다.

  • -finstrument-functions 모든 기능 시작 및 종료 지점에서 사용자 제공 프로파일 링 함수를 호출하는 코드를 추가합니다.


답변

여기 내 것이 있습니다 :

  • -Wextra, -Wall: 필수.
  • -Wfloat-equal: 일반적으로 부동 소수점 숫자가 동일한 지 테스트하는 것이 좋지 않기 때문에 유용합니다.
  • -Wundef: #if지시문 에서 초기화되지 않은 식별자가 평가되면 경고합니다 .
  • -Wshadow: 지역 변수가 다른 지역 변수, 매개 변수 또는 전역 변수를 가리거나 내장 함수가 그림자 될 때마다 경고합니다.
  • -Wpointer-arith: 함수 크기 또는 크기에 따라 달라지는 경우 경고합니다 void.
  • -Wcast-align: 대상의 필요한 정렬이 증가하도록 포인터를 캐스트 할 때마다 경고합니다. 예를 들어 정수가 2 바이트 또는 4 바이트 경계에서만 액세스 할 수있는 컴퓨터에서 a char *가 캐스팅 된 경우 경고합니다 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