programing

C/C++ 컴파일러에 대한 최적의 컴파일러 경고 수준?

prostudy 2022. 5. 13. 23:50
반응형

C/C++ 컴파일러에 대한 최적의 컴파일러 경고 수준?

다른 C/C++ 컴파일러에 대해 권장하는 컴파일러 경고 수준은?

gcc와 g+++는 기본 레벨에서 많은 것을 얻을 수 있게 해줄 것이다.나에게 가장 좋은 경고 수준은 '-월'이라고 생각한다.그리고 나는 항상 그것이 발생시키는 경고에 대한 코드를 제거하려고 노력한다. (논리적 우선 순위 규칙에 괄호를 사용하는 것에 대한 바보 같은 것들 조차도 '만약 (x = y))'를 의미한다고 말한다.

Sun CC, aCC(HPUX), Visual Studio, Intel과 같은 여러 컴파일러에서 가장 좋아하는 수준은?

편집:

gcc/g++에서 "-Werror"(하지만 유틸리티는 이해하지만)를 사용하지 않는다는 것을 지적하고 싶었을 뿐인데, 그 이유는 다음과 같다.

# 경고 "이것은 나 자신에게 보내는 쪽지"

내 코드의 몇 군데에서 말이야모든 컴파일러가 #경고 매크로를 이해하고 있는가?

이건 C++ 코드에 사용하는 파라노이드 깃발 세트 입니다.

    -g -O -Wall -Weffc++ -pedantic  \
    -pedantic-errors -Wextra -Waggregate-return -Wcast-align \
    -Wcast-qual  -Wchar-subscripts  -Wcomment -Wconversion \
    -Wdisabled-optimization \
    -Werror -Wfloat-equal  -Wformat  -Wformat=2 \
    -Wformat-nonliteral -Wformat-security  \
    -Wformat-y2k \
    -Wimplicit  -Wimport  -Winit-self  -Winline \
    -Winvalid-pch   \
    -Wunsafe-loop-optimizations  -Wlong-long -Wmissing-braces \
    -Wmissing-field-initializers -Wmissing-format-attribute   \
    -Wmissing-include-dirs -Wmissing-noreturn \
    -Wpacked  -Wpadded -Wparentheses  -Wpointer-arith \
    -Wredundant-decls -Wreturn-type \
    -Wsequence-point  -Wshadow -Wsign-compare  -Wstack-protector \
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch  -Wswitch-default \
    -Wswitch-enum -Wtrigraphs  -Wuninitialized \
    -Wunknown-pragmas  -Wunreachable-code -Wunused \
    -Wunused-function  -Wunused-label  -Wunused-parameter \
    -Wunused-value  -Wunused-variable  -Wvariadic-macros \
    -Wvolatile-register-var  -Wwrite-strings

그럼 시작할 수 있을 거야프로젝트에 따라 타사 라이브러리에서 경고가 수신되지 않도록(보통 경고가 무료인 것에 대해 상당히 부주의함) 경고음을 표시해야 할 수 있다.예를 들어, 부스트 벡터/매트릭스 코드는 g++가 많은 노이즈를 발생시킨다.

이러한 경우를 처리하는 더 좋은 방법은 g++ 주위에 포장지를 쓰는 것인데, 이 포장지는 여전히 최대치로 조정된 경고를 사용하지만 특정 파일/라인 번호에 대한 경고가 보이지 않도록 하는 것이다.나는 오래 전에 그런 도구를 썼고, 청소할 시간이 되면 그것을 내놓을 것이다.

나는 사용하는 경향이 있다.-Wall(모든 사람이 벌레를 만들기 때문에, 아무도 완벽하지 않다) , 그러나 나는 사용하지 않는다.-Werror(경고를 오류로 표시) 왜냐하면 gcc는 어쨌든 옳은 것에 대해 경고하기 때문이다(허위 긍정).

아무도 아직 인텔 컴파일러에 대해 언급하지 않았다.

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-D060680A-1A18-4574-8291-5C74E6E31335.htm

-w3는 꽤 수다스러워서, -w2를 추천하고 싶다.

VC도 지원한다고 생각한다.

#pragma message ("note to self")

하지만 시스템이 성장하고 발전하면서, 그리고 30명의 개발자들이 동시에 작업하게 되면, 스스로에게 모든 노트를 읽어주는데 며칠이 걸리는데, 심지어 그 정도에서, 자아는 단지 노트 읽기만 할 뿐이고, 결국 따라가지 못하고 사임해야 하는 스트레스 속에서 깨질 것이다...

아니, 정말로, 만약 당신이 그것을 허용한다면, 경고의 양은 빠르게 증가할 것이고, 당신은 정말로 중요한 변수들을 발견할 수 없을 것이다. (단일화 변수들, 이 포인터는 생성자에 사용되는 것, ...)

그래서 나는 경고를 오류로 취급하려고 한다: 대부분의 경우 컴파일러가 나에게 경고하는 것이 옳고, 그렇지 않다면, 나는 그것을 코드에 기록하고 미리 경고를 한다.

#pragma warning ( push )
#pragma warning ( 4191 : disable )
// violent code, properly documented
#pragma warning ( pop )

방금 읽었는데...warning ( N : suppress )실용주의도 마찬가지야

GCC에서는 선호도를 위해-Wall -Wextra -Wwrite-strings -Werror , , , 한다.std= 어떤 할 수 있어야 프로젝트에 따라 어느 표준이 달라진다: 주로 얼마나 휴대할 수 있어야 하는가에 달려 있다.

내가 사용하는 이유-Werror경고가 실제 버그를 나타내지 않더라도 (나에게는) 받아들일 수 없다는 것이다.나는 경고의 원인이 무엇이든지 간에 내 남은 인생을 컴파일할 때마다 경고를 무시하는 것보다 더 일하고 싶다.일단 컴파일에서 경고를 허용하면, 지난번에 없었던 경고를 놓치는 것은 너무 쉽다.

물론 제3자 코드를 다룰 때는 경고를 없애지 못할 때도 있다.그러면 나는 사건별로 그 사건을 완화시킬지 여부를 결정하곤 했다.-W , 제거, 제거-Werror그리고 예상 경고만 발생하는지 확인하기 위해 스크립트를 작성하거나 타사 코드를 수정할 수 있다(경고를 "수정"하거나 가능하면 실용주의로 비활성화하기 위해 필요).

C에서는 Visual C++를 한다./W4그리고/WX(경고를 오류로 표시)

./Wall표준 헤더와 호환되지 않음.

나는 경고를 오류로 취급하기로 선택했다. 왜냐하면 그것은 내가 경고를 고치도록 강요하기 때문이다.모든 경고는 내가 고친다고 해도, 그게 더해진다고 해도#pragma경고를 무시하는 것 - 그런 식으로, 나는 분명히 경고에 대해 알고 있다고 말하고 있다(그래서 다른 개발자들이 그것에 대해 나에게 이메일을 보내지 않을 것이다.

나는 항상 -Wall을 사용하는 것에 동의한다.또한 코드가 규정을 준수하는지 확인하려면 -pedantic도 사용하십시오.바이트 수준에서 유니언과 구조체를 처리할 때 도움이 될 수 있는 또 다른 경고는 -Wadded이다.

나는 Errors를 켰을 때 Warning으로 모든 개발을 한다.

나는 여전히 VC6에서 발전하기 때문에 내 코드에 #Pragma가 많다. (주로 4786년)

여기 GCC에 대한 좋은 선택사항 목록이 있다: http://mces.blogspot.com/2008/12/year-end-cleaning-ie-on-warning-options.htm. -월에서 가능한 모든 경고가 가능하지는 않으며, 일부 경고는 구체적으로 활성화되어야 한다.

나는 함수의 정의뿐만 아니라 -Wall과 엄격한 프로토타입을 좋아한다.그것들의 오류는 매우 유용할 수 있다.또한 -Wextra는 조건부로 의도했지만 실수로 다음과 같이 쓰여진 것들과 같은 모든 종류의 것들을 집어낼 것이다.

if (something);
   classic_way_to_leak_memory();

유닉스 같은 시스템에서는 사용자의 ENV 선호를 따라야 한다.따라서 그들이 보고 보고하는 것은 당신이 필요로 하는 것과 완전히 다를 수 있다. :)

나는 또한 펀칭광이기 때문에 사용자가 원하지 않는 한 -Fno-strict-aliasing을 설정하는 경향이 있다.고전적인 C에서의 안전한 메모리 관리는 다른 방법으로는 달성하기 어렵다.

Visual C에서 나는 /w3을 사용한다.나는 w4가 너무 많은 소음을 토해낸다는 것을 발견했다. MS 라이브러리의 많은 소음을 모든 빌드에 적용하기에는.추가 경고는 매우 경미하고 지금까지 벌레의 원인이 되지 않았다.

나는 또한 내 프로젝트에서 컴파일러를 주는 가능한 모든 경고를 확인하는 것을 좋아한다.불행히도 인텔 C++ 컴파일러에 대한 대답은 나에게 별로 유익하지 않았다.나는 나만의 연구를 했다.

나는 Qt 5Qmake를 사용하기 때문에 미리 정의된 경고 레벨 -w1이 있다.그것으로는 아무것도 할 수 없어.그러나 이것이 전부가 아니며 ICC에는 더 많은 키가 있다.

-Wcomment 
-Weffc++ 
-Wextra-tokens 
-Wformat 
-Winline // don't use, show only for example
-Wmain 
-Wmissing-declarations 
-Wmissing-prototypes 
-Wnon-virtual-dtor 
-Wp64 
-Wpointer-arith 
-Wremarks 
-Wreturn-type 
-Wsign-compare 
-Wstrict-aliasing 
-Wstrict-prototypes 
-Wtrigraphs 
-Wuninitialized 
-Wunknown-pragmas 
-Wunused-variable

모든 키에 대해 자세히 알아보십시오.

또한 GCC와 달리 ICC는 하나의 키에 대해 여러 개의 경고를 발생시키며, 예를 들어 키 -Weffc++를 생성한다.모든 목록에서 몇 개의 경고만 표시하려는 경우 키 -wd를 사용하십시오.

사용 불가능: -wd1418,2012,2015,2017,2022,2013.그리고 경고 -wd1572,873,2259,2261은 기본적으로 qmake에서 비활성화되었다.

나는 PCH를 사용하고 Qt Creator에서 오류와 같은 PCH 파일 사용에 대한 메시지를 보는 것이 매우 귀찮다는 것을 발견했다.사용하지 않으려면 -Wno-pch-messages를 사용하십시오.

코드에서 경고를 비활성화하려면 다음을 사용하십시오.

#if defined(Q_CC_INTEL)
    #pragma warning( push )
    #pragma warning( disable: 2021 )
#endif

// some code

#if defined(Q_CC_INTEL)
    #pragma warning( pop )
#endif

모두들 대답해줘서 고마워.gcc/g++ 말고는 아무거나 사용한 지 꽤 됐다.오래전에 써야 했던 것들은

-fmessage-length = 0(g++는 줄 바꿈 메시지라는 불쾌한 습관을 가지고 있었기 때문에)
-Wno-depressed(기존의 std 네임스페이스에 대한 코드 기반 작업 이후)

Sun Workshop CC 컴파일러의 기본 경고 수준을 넘는 것은 너무 과했다는 것을 기억한다.나는 또한 이것이 인텔 컴파일러에게 사실일 수도 있다고 생각한다.나는 한동안 비 그누 컴파일러들과 데이트를 하지 못했다.

GCC 컴파일러들은 새로운 버전이 나올 때마다 엄격해진다.깃발 사용-ansiANSI 언어 표준의 가장 엄격한 해석의 위반에 대한 경고를 생성한다.보통 현재 컴파일러에서 작동하지만 다음 버전이나 다른 컴파일러에서 오류가 발생할 수 있다.이 플래그는 컴파일러/반전을 전환할 때마다 코드를 포팅할 필요가 없도록 도와준다.

참조URL: https://stackoverflow.com/questions/399850/best-compiler-warning-level-for-c-c-compilers

반응형