2014-09-21 2 views
1

g ++에 경고 플래그를 추가하여 다음 코드에서 unitialized b 변수에 대해 경고합니다.더 나은 컴파일러 경고?

#include <iostream> 
using namespace std; 
int main() { 
    int a, b; 
    cin >> a; 
    while (a>0) b++; 
    cout << a; 
} 

편집 : Flags to enable thorough and verbose g++ warnings하지만 아무것도 트리거 : 나는이 다른 질문에 나열된 플래그를 켜기 시도 언급하는 것을 잊었다. (아래에서 배운 바와 같이 "간지럼!")

+0

'g ++ -Wall -Wextra'를 시도 했습니까? –

+1

내 테스트 결과 엄청난 경고 그룹 (-Wall, -Wextra, -pedantic)을 가진 GCC의 경고가 표시되지 않으며 Clang은 경고를 표시합니다. – chris

+1

컴파일 플래그 ie를 추가 할 수 있습니다. -벽. http : // stackoverflow.com/questions/11714827/글자 그대로 -gcc-warnings 모두 – risque

답변

7

를 참조하십시오. 이 두 가지 모두를 켜는 -Wall 옵션의 일부이며 다른 많은 경고 (-Wxxx 옵션은 경고와 관련이 있습니다).

gcc에 대한 경고 옵션에 대한 전체 설명서는 gcc 설명서의 Options to Request or Suppress Warnings에서 읽을 수 있습니다.

-Wextra (단독으로 사용하거나 -Wall과 함께 사용하는 경우)을 사용할 수도 있습니다. -Wextra-Wuninitialized을 사용할 수 있지만, 항상 -Wall으로 설정되는 것은 아니며, 내가보고 싶은 것 (-Wunused-parameter-Wunused-but-set-parameter과 같은 것)이 있습니다.이 코드에만 국한되지는 않습니다. 했다 ... 나는이 gcc가이 기능을 사용하여 오류를 자극 수없는 것 http://gcc.godbolt.org 볼 수 있습니다 (참 "말했다"는 거기에)


.

는 특히 -Wmaybe-uninitialized

#include <iostream> 
using namespace std; 
int main() { 
    int a, b; 
    int x, y, z; 
    // warning: variable ‘y’ set but not used [-Wunused-but-set-variable] 
    cin >> a; 
    while (a>0) b++; 
    switch(a) { 
    case 1: x = 1; y = 1; z++; break; 
    // warning: ‘z’ may be used uninitialized in this function [-Wmaybe-uninitialized] 
    case 2: x = 4; y = 2; break; 
    case 3: x = 5; y = 3; 
    } 
    cout << a; 
    cout << b; 
    cout << x; 
} 

이에 대한 문서에 설명 된 일부 코드를 확장하는 것은 사용되지 않는 및 일체화 된 경고의 번호를 자극하기위한 시도이다. 오류를 생성하기 위해 z 변수를 가져올 수 있었지만 어떤 이유로 인해 루프가 gcc (gcc 4.9.0을 사용하여 테스트 됨)에서 오류 또는 경고를 생성하지 않는 동안 b++이 발생했습니다.

Warnings with gcc 4.9.0

연타 버전 3.4.1은, 그러나, 모두 bz

Warnings with clang 3.4.1

그리고 잠시 -Wall에 대한 명령 행 옵션을 사용하여 경고를 생성 않습니다 및 -Wextra이어야합니다. 어떤 이유로 gcc 4.9.0에서이 특정 코드 조각에 대해 원하는 경고를 내지 못합니다.

+0

http://coliru.stacked-crooked.com/a/14e57e5734b03dbf – chris

+0

@chris'# clang ++ -std = C++ 1y' ... gcc가 아닙니다. –

+0

'#'은 주석입니다. 아래 두 줄을보십시오. 자주 사용하는 몇 가지 사항을 유지하고 다시 작성하지 않고도 전환 할 수 있습니다. – chris