2011-12-16 3 views
4

다음 코드를 감안할 때 :sense-less 및 buggy switch 문에 대한 경고를 트리거하는 컴파일러 나 옵션이 있습니까?

bool doGoodThing; 

switch (some_variable) 
{ 
case 1: 
case 2: 
    doGoodThing = true; 

default: 
    doGoodThing = false; 
} 

최신 gcc 버전은 변수가 등등에 할당하지만 여전히 사용하지 될 때 감지 할만큼 똑똑하다. 전체 스위치가 이와 같은 코드에 대해 이해하지 못한다는 경고를 트리거 할 수있는 컴파일러 나 플래그가 있습니까?

업데이트 : 질문에 대한 변수가 doGoodThing입니다. 그것은 어리석은 switch 진술에 대해서는별로 의미가 없습니다.

UPDATE 2 : 중복으로 표시하기 전에 "dupe"유권자를 통과 시키십시오. 한 번 더 질문을 읽으십시오. 이것은 "case"다음에 "break"문이 누락되었다는 경고가 아닙니다. 이것은 데드 코드, 논리적 오류, 컴파일러에 의한 코드의 정적 인 의미 분석에 관한 것입니다. "중단"이 없다면 나는 경고 할 필요가 없습니다.

+0

이 스 니펫은 나에게 완벽하게 이해합니다. – BlackBear

+0

http://stackoverflow.com/questions/7703358/how-can-i-tell-gcc-to-warn-or-fail-on-switch-case-statements-without-a-break – cnicutar

+0

어떤 의미에서 이해가 안되니? 컴파일러에서 코드의 의미 적 의미를 확인하도록 하시겠습니까? – Nawaz

답변

4

좋아요를, 그래서 우리는 찾고 어떤 규칙에 따라

bool doGoodThing; 

switch (some_variable) 
{ 
case 1: 
case 2: 
    doGoodThing = true; 

default: 
    doGoodThing = false; 
} 
경고를 생성 할 것이다

하지만, (아마도 여기에 의도 된 코드입니다)

bool doGoodThing; 

switch (some_variable) 
{ 
case 1: 
case 2: 
    doGoodThing = true; 
    break; 

default: 
    doGoodThing = false; 
} 

는 않을 것입니다. 상대적으로 간단한 방법은 케이스가 비어있는 경우를 제외하고 항상 fall-through에 대해 경고하는 것입니다. 나는. 사이에 코드가 없기 때문에 사례 1에서 사례 2까지의 가을에 대해 경고하지 말고 2에서 기본값까지의 가을에 대해 경고합니다. 그러나이 방법은 여전히 ​​의도적 일 수있는 코드에 대해 경고합니다.

보다 정교한 규칙은 다음과 같습니다. x 변수에 대한 할당이있을 때마다 경고가 표시되어 가능한 실행 경로가 없어서 할당 된 값이 사용됩니다. 나는. x에 할당 된 모든 실행 경로에서 v, xx을 사용하는 코드가 실행되기 전에 다른 것으로 다시 할당되거나 범위를 벗어납니다. 이렇게하면 코드에 대해 경고하지만 고정 된 예는 알 수 없습니다.

이 분석을 확실히 수행 할 수 있습니다. 그러나 나는 현재 그러한 분석을 수행하는 컴파일러에 대해서는 전혀 알지 못한다. (실제로 모든 것은 gcc가 그렇지 않다는 것을 의미한다.)

+2

만세, 누가 apperently 질문을 이해 (또는 내가 너무 오해). – Xeo

+2

"할당 된 값이 사용될 수 있도록 가능한 실행 경로가 없도록 변수 x에 대한 할당이있을 때마다 경고를 생성합니다." - 이! 감지하고 경고하는 것은 꽤 명백한 것 같고 gcc는 이미 사용되지 않는 값에 대한 경고를 이미 가지고 있습니다.switch 문은 switch 문이나 다른 논리적으로 똑같은 문제로 인해 발생했는지 여부와는 관계가 없기 때문에 switch 문은 여기에 약간의 빨간색 청어라고 생각합니다. 예를 들어'if (condition) foo = 1; foo = 2;' –

5

switch 문에서 누락 된 중단에 대해 언급하는 경우 asked ehancement in GCC입니다.

편집 2 : CPPCheckto detect something related 것 : 당신은 자바, 다시 FindBugs could do it for you

편집 사용한 경우 스위치 문에서

중복 할당이

+0

(+1) 같은 링크를 올릴 예정입니다. – NPE

+0

링크가 이미 표시된 복제본에 게시되어 있습니다. –

+0

이것은 거의 비슷하지만 코드 전체에 나누기없이 스위치 케이스를 사용합니다. gcc가 잘못된 반응을 보이기 시작하면, 나는 그 경고를 막지 만. 가능한 버그 나 데드 코드를 감지하고 그러한 경우에 대해서만 경고하는 것이 좋을 것입니다. 그러나 좋은 대답, 감사합니다. –