C / C ++ 컴파일러 경고 : 모든 코드를 정리하여 제거하거나 남겨 두나요?

StackOverflow https://stackoverflow.com/questions/183788

문제

나는 다른 사람들이 업데이트하도록 코드를받은 많은 프로젝트에서 작업했습니다. 종종 컴파일하고 약 1,000 개 이상의 컴파일러 경고를받습니다. 컴파일러 경고를 볼 때 그들은 더러워지게합니다. 그래서 첫 번째 작업은 코드를 정리하고 모두 제거하는 것입니다. 일반적으로 초기화되지 않은 변수와 같은 12 가지 문제에 대해서는 알 수 있습니다.

나는 사람들이 왜 그들을 떠나고 경고없이 완벽하게 깨끗한 컴파일을 가지고 있지 않은지 이해하지 못합니다. 내가 뭔가를 놓치고 있습니까? 그냥 떠나야 할 유효한 이유가 있습니까? 공유 할 공포 이야기가 있습니까?

도움이 되었습니까?

해결책

경고를 정리할 것입니다. 당신이 아는 사람들조차도 무해합니다 (그러한 것이 존재하는 경우)는 코드를 컴파일 할 사람에게 당신에게 나쁜 인상을 줄 것입니다.

다른 사람 코드에서 작업해야한다면 내가 찾을 "냄새"표지판 중 하나입니다.

실제 오류 나 잠재적 인 미래 문제가 아니라면 경사의 징후가 될 것입니다.

다른 팁

실제 문제를 나타내지 않더라도 깨끗하게 청소하십시오. 그렇지 않으면 경고가 있다면 하다 실제 문제가 나타나면 모든 소음을 통해 볼 수는 없습니다.

내 작업에서 오류가 켜지면서 경고를 처리하기위한 컴파일러 설정이 있습니다. 따라서 경고가 없거나 컴파일하지 않습니다 :)

나는 모든 경고를 제거하는 것이 가장 좋다는 데 동의합니다. 수천 개의 경고를 받고 있다면 수정 사항의 우선 순위를 정해야합니다.

컴파일러를 가장 낮은 경고 수준으로 설정하십시오. 이러한 경고가 가장 중요해야합니다. 고정되면 경고 수준을 증가시키고 가장 높은 경고 수준에 도달 할 때까지 반복하십시오. 그런 다음 경고가 오류로 취급되도록 컴파일 옵션을 설정하십시오.

무시하는 것이 안전하다고 의심되는 경고를 발견하면 이론을 확인하기 위해 연구를 수행하십시오. 그런 다음에야 가장 최소한의 방식으로 만 비활성화하십시오. 대부분의 컴파일러에는 있습니다 #pragma 파일의 일부에 대한 경고를 비활성화/활성화 할 수있는 지침. 시각적 C ++ 예는 다음과 같습니다.

typedef struct _X * X; // from external header, not 64-bit portable

#pragma warning( push )
#pragma warning( disable: 4312 ) // 64-bit portability warning
X x = reinterpret_cast< X >( 0xDDDDDDDD ); // we know X not 64-bit portable
#pragma warning( pop )

이것은 한 줄의 코드 라인에 대한 경고 만 비활성화합니다. 이 방법을 사용하면 향후 코드를 간단한 텍스트 검색하여 변경할 수 있습니다.

또는 일반적으로 단일 파일 또는 모든 파일에 대한 특정 경고를 비활성화 할 수 있습니다. IMHO 이것은 위험하며 최후의 수단이어야합니다.

청소하십시오 가능하다면. 멀티 플랫폼/다중 컴필라 코드베이스 (6 개의 다른 컴파일러가있는 7 개의 다른 OSS에서 컴파일 한 코드베이스)에서는 항상 불가능하지는 않습니다. 컴파일러가 정당한 경우를 보았습니다 잘못된 (이타늄의 HP-UX ACC, 나는 당신을보고 있습니다) 그러나 그것은 드문 일입니다. 다른 사람들이 지적한 것처럼 그러한 상황에서 경고를 비활성화 할 수 있습니다.

이 버전의 컴파일러에서 경고는 다음 버전에서 오류가 될 수 있습니다 (GCC 3.X에서 4.X로 업그레이드하는 사람은 누구나 익숙해야합니다).

일부 컴파일러는 특정 상황에서 문제가 될 실제로 유용한 경고를 방출 할 것입니다. Visual C ++ 2005와 2008은 64 비트 문제에 대해 경고 할 수 있습니다. 이는 오늘날 큰 이점입니다. 64 비트로 마이그레이션 할 계획이 있다면 이러한 종류의 경고를 청소하면 항구 시간이 크게 줄어 듭니다.

코드로 경고를 남길 수있는 사례가 있거나 청소할 수없는 곳이 있습니다 (내가 할 수있는 것을 제거하지만). 예를 들어:

  • 작업중 인 작업이 있고 더 많은 작업/주의가 필요하다는 것을 알고 있다면, 이것이 적절할 수 있음을 나타내는 경고를 남겨 두십시오.
  • /clr로 C ++를 컴파일하는 경우 기본 코드가 생성되는 것들에 대한 몇 가지 경고가 있습니다. 코드베이스를 기능적으로 변경할 수 없을 때 이러한 모든 경고를 억제하는 것은 번거로운 일입니다.
  • 수정이 무엇을하는지 이해하지 못할 때 경고 정리. PC 린트 경고로 몇 번 이나이 작업을 수행했고 결국 버그를 소개했습니다. 변화의 정확한 효과가 무엇인지 모른다면 (예 : 경고를 제거하기위한 C 스타일 캐스트)를하지 마십시오. 경고를 파악하거나 코드를 혼자 두는 것이 내 조언입니다.

어쨌든, 그것들은 경고를 떠나는 것이 적절할 수있는 내 머리 꼭대기의 사례입니다.

최악의 부분은 새 코드를 작성할 때 실수로 더 많은 경고를 소개했는지 알기가 어렵다는 것입니다.

그것들을 모두 청소하는 데있어 문제는 당신이 가질 수있는 시간이 걸린다는 것입니다. 그러나 그렇습니다. 일반적으로 가능한 한 많이 청소해야합니다.

코드를 고칠 시간이 없기 때문에 코드에 경고를 남기는 것은 아침에 시간이 충분하지 않기 때문에 양치질을하지 않는 것과 같습니다. 코드 위생의 기본 문제입니다.

항상 경고를 정리하십시오. 경고가 정상이라는 특정 사례가있는 경우 해당 인스턴스에 대해서만 억제하십시오.

일부 경고는 양성 일 수 있지만 대부분 코드의 실제 문제를 나타냅니다.

모든 경고를 정리하지 않으면 경고 목록이 계속 커지고 경고 소음의 바다에서 실제 문제 사례가 손실됩니다.

정말 좋은 프로그래머의 특성 중 하나는 나쁜 코드가 그들에게 queasy 뱃속을 준다는 것입니다.

나는 모든 코드를 컴파일러를 깨끗하게 만들뿐만 아니라 IDE 내부에서 상당히 까다로운 수준으로 설정되도록 노력합니다. 도구보다 더 잘 알고 있다면 경고 인스턴스를 억제해야하지만 적어도 문서화 역할을합니다.

나는 항상 모든 경고를 가능하게 한 다음 경고가 있으면 건축을 중단하도록 프로젝트를 설정했습니다.

경고가있는 경우 문제가 없는지 확인하기 위해 각각을 확인해야합니다. 이것을 반복해서하는 것은 시간 낭비입니다. 이 작업을 수행하지 않으면 오류가 코드에 들어 오게됩니다.

경고를 제거하는 방법이 있습니다 (예 : #pragma argsused).

컴파일러가 작업을 수행하도록하십시오.

나는 경고가 불안정, 충돌 또는 메모리 손상을 초래할 수있는 여러 임베디드 시스템과 협력했습니다. 경고가 무해하다는 것을 알지 못하면 처리해야합니다.

경고는 버그로 취급되어야합니다. 경고를 없애기에 충분히 잘 코딩 할 수 없다면 코딩하지 않아야 할 것입니다. 내 그룹에서 우리는 모든 경고를 오류로 강요하기로 결정했습니다. 그것은이 토론을 완전히 끝내고 실제로, IMHO는 코드 품질을 향상시킵니다.

나는 경고를 싫어한다. 나는 가능한 한 많이 제거합니다.
때때로, 일을 끝내야한다는 압박을받을 때, 나는 그들 중 일부를 떠난다. 나는 거의 그들을 떠나지 않습니다. 남은 것이 있다면 더러운 느낌이 듭니다.

내가 작업하는 코드베이스에는 4000 개가 넘는 경고가 있습니다. 그들 중 일부는 합법적 인 문제입니다. 우리는 들어가서 고칠 시간이 주어지지 않으며, 다른 깨진 것들을 리팩터링하지도 ... 부분적으로, 이것은 코드가 너무 오래되어 표준화 된 C ++가 사전을 초래하기 때문입니다. VC ++ 6에서만 컴파일 할 수 있습니다.

항상 모든 경고를 정리하거나 필요한 경우 명시 적으로 억제하십시오. 컴파일 할 때 경고에 대한 기본 설정이 가장 높아야합니다 (예 : 레벨 4).

내가 지금 유지하는 코드를 만든 상사. 그는 컴파일러 플래그를 사용하여 자신의 박탈 경고를 숨 깁니다.

시간이 있으면 내가 할 수있는 것을 통과하고 정리합니다.

"서명 / 부호없는 비교"경고를 제외하고는 상당히 높은 수준의 경고로 코드를 컴파일하고 모두 청소하려고합니다.

짧은 버전 : g ++에서 나는 "-wextra -wno-sign-compare"를 사용하고 모든 메시지를 제거합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top