sourcecode

C에 유용한 GCC 플래그는 무엇입니까?

copyscript 2022. 8. 10. 22:15
반응형

C에 유용한 GCC 플래그는 무엇입니까?

설정 이상-Wall, 및 설정-std=XXXC에서 사용할 수 있는 컴파일러 플래그는 그 밖에 어떤 것이 있습니까?

나는 특히 우발적인 유형의 불일치를 완전히 최소화하기 위해 추가 경고 및/또는 경우에 따라 경고를 오류로 전환하는 데 관심이 있습니다.

여기 제 것이 있습니다.

  • -Wextra,-Wall: 필수.
  • -Wfloat-equal: 보통 부동 소수점 숫자의 동일성을 테스트하는 것은 좋지 않기 때문에 편리합니다.
  • -Wundef: 초기화되지 않은 식별자가 에서 평가되는 경우 경고합니다.#if지시.
  • -Wshadow: 로컬 변수가 다른 로컬 변수, 파라미터 또는 전역 변수를 가리거나 내장 함수가 음영 처리될 때마다 경고합니다.
  • -Wpointer-arith: 함수의 크기나 크기에 따라 달라지는 것이 있으면 경고합니다.void.
  • -Wcast-align: 타겟의 필요한 정렬이 증가하도록 포인터가 캐스팅될 때마다 경고합니다.예를 들어 다음과 같이 경고합니다.char *에 캐스팅되다int *2바이트 또는 4바이트 경계에서만 정수에 액세스할 수 있는 기계에서 사용됩니다.
  • -Wstrict-prototypes: 인수 유형을 지정하지 않고 함수가 선언되거나 정의된 경우 경고합니다.
  • -Wstrict-overflow=5: 컴파일러가 서명된 오버플로는 발생하지 않는다고 가정하여 최적화하는 경우에 대해 경고합니다.(값 5는 너무 엄격한 경우가 있습니다.매뉴얼 페이지를 참조해 주세요).
  • -Wwrite-strings: 문자열 상수에 유형을 지정합니다.const char[길이]한 사람의 주소를 복사해서 다른 사람의 주소를 복사하지 않도록const char *포인터가 경고를 받습니다.
  • -Waggregate-return: 구조 또는 결합을 반환하는 함수가 정의되거나 호출된 경우 경고합니다.
  • -Wcast-qual: 포인터가 캐스팅될 때마다 대상 유형에서* 유형 한정자를 제거하도록 경고합니다.
  • -Wswitch-default: 경고:switch스테이트먼트에는 다음이 없습니다.default케이스를* 클릭합니다.
  • -Wswitch-enum: 경고:switch스테이트먼트는 열거형 인덱스를 가지며 인덱스가 없습니다.case해당 열거의* 하나 이상의 명명된 코드에 대해 지정합니다.
  • -Wconversion: 값을 변경할* 수 있는 암묵적인 변환에 대해 경고합니다.
  • -Wunreachable-code: 컴파일러가 해당 코드를 실행하지* 않을 경우 경고합니다.

마크가 붙어 있는 것은 가짜 경고를 너무 많이 하는 경우가 있기 때문에 필요에 따라 사용합니다.

C/C++와는 그다지 관계가 없지만, 어쨌든 도움이 됩니다.

@file

위의 정상 플래그(모두 지정)를 모두 '파일'에 넣고 이 플래그를 사용하여 해당 파일의 모든 플래그를 함께 사용합니다.

예:

파일: 컴파일러 플래그

- 벽

- std=c99

- Wextra

다음으로 컴파일 합니다.

gcc yourSourceFile @compilerFlags

아직 아무도 이런 말을 하지 않은 게 놀랍다. 내가 아는 한 가장 유용한 깃발은-g디버깅 정보를 실행 파일에 저장하여 디버깅하고 소스(어셈블리를 읽고 능숙하지 않은 경우)를 통과할 수 있도록 합니다.stepi명령)을 실행합니다.

그 중 몇 가지-f코드 생성 옵션은 다음과 같습니다.

  • -fverbose-asm를 사용하여 컴파일 할 때 편리합니다.-S어셈블리 출력을 조사합니다. - 몇 가지 유용한 설명을 추가합니다.

  • -finstrument-functions는 각 함수의 입구 및 출구 포인트에서 사용자가 제공한 콜프로파일링 함수에 코드를 추가합니다.

  • --coverage프로그램에서 분기 및 호출을 계측하고 탐지 범위 노트 파일을 생성하므로 프로그램이 테스트 탐지 범위 분석을 위해 포맷할 수 있는 탐지 범위 데이터가 생성됩니다.

  • -fsanitize={address,thread,undefined}AddressSanitizer, ThreadSanitizer, UndefinedBehaviorSanitizer.이들은 프로그램을 계측하여 런타임에 다양한 종류의 오류를 확인합니다.

에서 이 도 '아까부터 하다'에 대해서 언급했습니다.-ftrapv 이 은, 「 」, 「 」, 「 」로 되었습니다.-fsanitize=signed-integer-overflow중이며, ''가 하게 되어 있습니다.-fsanitize=undefined.

「」를 사용합니다.-O상위)-O1,-O2,-Os) 에서는 gcc는 로 하고 있으며, 통일에 대한 .기본 최적화 수준에서는 gcc는 컴파일 속도를 추구하며 통합 변수 등에 대해 경고할 만큼 충분한 분석을 수행하지 않습니다.

것을 고려해보세요.-Werror컴파일을 중지하지 않는 경고는 무시되는 경향이 있기 때문에 정책입니다.

-Wall에러일 가능성이 높은 경고를 거의 켭니다.

포함된 -Wextra일반적인 합법적인 코드에 플래그를 붙이는 경향이 있습니다.코드 리뷰에는 도움이 될 수 있지만(보풀 스타일의 프로그램이 훨씬 더 유연하지만) 일반 개발에서는 켜지 않습니다.

-Wfloat-equal프로젝트 개발자가 부동 소수점에 익숙하지 않은 경우에는 좋은 아이디어이고, 그렇지 않은 경우에는 나쁜 아이디어입니다.

-Winit-self이 된다,안 ?-Wuninitialized.

-Wpointer-arith는, 휴대 의 대부분이,하지 않는 합니다.-pedantic.

-save-temps

그러면 프리프로세서와 어셈블리의 결과가 남습니다.

전처리된 소스는 매크로 디버깅에 도움이 됩니다.

이 어셈블리는 어떤 최적화가 적용되었는지 확인하는 데 유용합니다.예를 들어 GCC가 일부 재귀 함수에 대해 테일콜 최적화를 실행하고 있는지 확인할 수 있습니다.이 기능이 없으면 스택에 오버플로우가 발생할 수 있습니다.

-march=native=칩)에된 코드를 하기 위해 합니다.

이 되지 않지만,되지 않는 에러 검출에는 도움이 되지 않습니다.-masm=intel에서는, 「」를 사용합니다.-S훨씬 더 좋게 조립품 출력을 검사할 수 있습니다.

AT&T 조립 구문 때문에 머리가 너무 아파요.

여기 아직 언급되지 않은 위대한 깃발이 있습니다.

-Werror-implicit-function-declaration

선언하기 전에 함수를 사용할 때마다 오류를 표시합니다.

컴파일러에 의해 미리 정의된 프리프로세서플래그를 알아야 하는 경우:

echo | gcc -E -dM -

특정 문제를 수정하기 위한 플래그를 찾고 있는 스레드를 찾았습니다.이 스레드는 여기에 표시되지 않기 때문에, 투고중에 스탬프를 받고 있던 스레드를 추가합니다.

-Wformat=2를 붙이다

-Wformat > = > 의 콜을 printf ★★★★★★★★★★★★★★★★★」scanf지정된 형식 문자열에 적합한 유형이 있는지 확인하기 위해 등입니다.

여기서 정말 중요한 부분은 (GCC 매뉴얼에 따라) 다음과 같습니다.

-Wformat되어 있습니다.-Wall체크의 하려면 , 의 옵션을 사용해 주세요-Wformat-y2k,-Wno-format-extra-args,-Wno-format-zero-length,-Wformat-nonliteral,-Wformat-security , , , , 입니다.-Wformat=2사용 가능하지만 -Wall에는 포함되지 않습니다.

그냥 ㅇㅇㅇㅇㅇ가 해서-Wall가가모는는는는는는는는는는는 ;)

-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

는 가끔 끔끔사사를 사용한다.-s「 」 「 」 、 「 」

-s
    Remove all symbol table and relocation information from the executable.

출처 : http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options

-Werror모든 경고를 오류로 처리하여 컴파일을 중지합니다.매뉴얼 페이지에서는 컴파일러의 모든 명령줄 스위치에 대해 설명합니다.

  • -Wmissing-prototypes: 이전 시제품 선언 없이 글로벌 함수를 정의한 경우.
  • -Wformat-security: 발생할 수 있는 보안 문제를 나타내는 포맷 기능의 사용에 대해 경고합니다.현시점에서는, 다음의 콜에 대해서 경고하고 있습니다.printf그리고.scanf형식 문자열이 문자열 리터럴이 아니고 형식 인수가 없는 함수
  • -Werror=return-type: 함수가 gcc에서 반환되지 않을 때 오류를 적용합니다.그렇다./we4716Visual Studio에서.

  • -Werror=implicit-function-declaration: 함수가 정의되지 않았거나 포함되지 않은 경우 오류를 적용합니다.그렇다./we4013Visual Studio에서.

  • -Werror=incompatible-pointer-types: 따라서 포인터의 유형이 예상된 포인터 유형과 일치하지 않으면 오류가 발생합니다.그렇다./we4133Visual Studio에서.

사실 C코드를 크로스 플랫폼으로 유지하고 싶어서 CMake를 사용하고 있으며 제공된 cflag를 CMake Lists에 넣습니다.txt:

if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we4013 /we4133 /we4716")
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=return-type")
endif()

-M*옵션 패밀리

이를 통해 c 또는 c++ 소스 파일이 어떤 헤더 파일에 의존해야 하는지 자동으로 알아내는 make 파일을 쓸 수 있습니다.GCC는 이 의존관계 정보가 포함된 make 파일을 생성하고, 그 파일을 프라이머리 make 파일에서 포함합니다.

다음은 c++ 소스 파일과 헤더 파일로 가득 찬 디렉토리를 컴파일하여 모든 의존관계를 자동으로 검출하는 -MD 및 -MP를 사용하는 매우 일반적인 makefile의 예를 나타냅니다.

CPPFLAGS += -MD -MP                                         
SRC = $(wildcard *.cpp)                                                       

my_executable: $(SRC:%.cpp=%.o)                                                        
        g++ $(LDFLAGS) -o $@ $^                                               

-include $(SRC:%.cpp=%.d)

상세한 것에 대하여는, 다음의 블로그 투고를 참조해 주세요.

-Wstrict-prototypes -Wmissing-prototypes
man gcc

설명서는 설명이 좋은 흥미로운 깃발들로 가득합니다.단, -Wall은 gcc를 최대한 상세하게 만들 것입니다.더 많은 데이터를 원하는 경우 Valgrind 또는 오류를 확인하기 위한 다른 도구를 살펴봐야 합니다.

makefile에는 일반적으로 다음과 같은 내용이 있습니다.

  CFLAGS= -Wall -Wextra -Weffc++ -Os -ggdb
  ...
  g++ $(CFLAGS) -o junk $<
  gcc $(CFLAGS) -o $@ $<
  rm -f junk

이들 옵션 중 가장 중요한 것은 이전에 설명한 적이 있기 때문에 아직 언급되지 않은 두 가지 기능에 대해 설명하겠습니다.

제대로 된 C++ 컴파일러가 없는 플랫폼으로의 이식성을 위해 일반 C를 필요로 하는 코드 베이스로 작업하고 있지만, C++ 컴파일러(C 컴파일러 외에)를 사용하여 "추가" 컴파일을 수행합니다.여기에는 3가지 이점이 있습니다.

  1. C++ 컴파일러는 때때로 C 컴파일러보다 더 좋은 경고 메시지를 내게 준다.
  2. C++ 컴파일러는 -Weffc++ 옵션을 사용할 수 있습니다.이 옵션을 사용하면 유용한 힌트를 얻을 수 있습니다.평범한 C로만 컴파일러를 작성하면 이 힌트를 놓칠 수 있습니다.
  3. 플레인 C 코드가 유효하지 않은 C++ 코드(예를 들어 "bool"이라는 이름의 변수 정의)인 몇 가지 경계 조건을 피하면서 코드를 C++로 포트하는 것을 비교적 쉽게 유지할 수 있습니다.

네, 저는 절망적으로 낙천적인 Pollyana입니다.지금 어떤 플랫폼이 쓸모없다고 선언되거나 괜찮은 C++ 컴파일러를 얻으면 드디어 C++로 전환할 수 있을 라고 계속 생각하고 있습니다.저는 어쩔 수 없는 일이라고 생각합니다만, 유일한 문제는 경영진이 최종적으로 모두에게 조랑말을 발행하기 전인지 후에인지입니다. :-)

음.-Wextra표준이 되어야 합니다. -Werror경고를 오류로 변환합니다(특히 를 사용하지 않고 컴파일할 경우 매우 귀찮을 수 있습니다).-Wno-unused-result).-pedantic와 조합하여std=c89에 C99 기능을 사용하는 경우 추가 경고가 표시됩니다.

하지만 그게 다예요.C 컴파일러를 C 자체보다 더 type-save로 튜닝할 수 없습니다.

-Wfloat-equal

송신원: http://mces.blogspot.com/2005/07/char-const-argv.html

제가 좋아하는 다른 새로운 경고 중 하나는 -Wfloat-equal입니다.부동소수점 숫자가 같을 때마다 경고합니다.그거 참 용감하군!컴퓨터 그래픽스나 (최악의) 컴퓨터 지오메트리 알고리즘을 모두 프로그래밍했다면, 어떤 두 플로트도 동등하게 일치하지 않는다는 것을 알 수 있습니다.

이 답변은 다소 주제에서 벗어나고 질문에는 +1의 가치가 있습니다.

나는 특히 우발적인 유형의 불일치를 완전히 최소화하기 위해 추가 경고 및/또는 경우에 따라 경고를 오류로 전환하는 데 관심이 있습니다.
there is a tool that should catch out 모든. errors and potential errors that may not be obvious, there's 부목 which IMHO does a way better job in catching out errors compared to gcc or any other compiler for that matter. That is a worthy tool to have in your tool-chest.

부목 등의 보풀 타입의 툴을 사용한 정적 체크는 컴파일러 툴 체인의 일부여야 합니다.

특히 더 많은 경고가 있으면 좋겠는데

에 더하여-Wall,그-W또는-Wextra옵션(-W는 새로운 버전뿐만 아니라 이전 버전의 gcc에서도 작동합니다.새로운 버전은 대체 이름을 지원합니다.-Wextra(즉, 같은 것을 의미하지만 보다 자세한 설명)을 사용하면 다양한 경고가 추가로 활성화됩니다.

또한 이들 중 어느 쪽에도 의해 활성화되지 않은 경고도 더 많이 있습니다. 일반적으로 더 의심스러운 경우입니다.사용 가능한 옵션 세트는 사용 중인 gcc 버전에 따라 달라집니다.참조해 주십시오.man gcc또는info gcc자세한 내용은 또는 관심 있는 특정 gcc 버전의 온라인 설명서를 참조하십시오.그리고.-pedantic사용 중인 특정 표준에서 요구하는 모든 경고를 발행합니다(이는 다음과 같은 다른 옵션에 따라 다름).-std=xxx또는-ansi) 및 gcc 확장기능 사용에 대해 불만을 제기합니다.

우발적인 유형의 불일치를 완전히 최소화하기 위해 일부 경우에 경고를 오류로 전환합니다.

-Werror는 모든 경고를 오류로 바꿉니다.단, gcc가 특정 경고에 대해 선별적으로 그렇게 할 수는 없다고 생각합니다.

프로젝트별로 어떤 경고가 활성화되어 있는지(특히 를 사용하는 경우).-Werror외부 라이브러리의 헤더 파일 중 일부는 트립될 수 있습니다.(-pedantic특히 이 점, 내 경험상 도움이 되지 않는 경향이 있다.)

언급URL : https://stackoverflow.com/questions/3375697/what-are-the-useful-gcc-flags-for-c

반응형