2011-12-16 2 views
4

Учитывая следующий код:Есть ли какой-либо компилятор или опция для запуска предупреждения для беспроблемного и ошибочного оператора switch?

bool doGoodThing; 

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

default: 
    doGoodThing = false; 
} 

Последние gcc версия достаточно умны, чтобы обнаружить, когда переменные быть назначены, но до сих пор не используется, и так далее. Есть ли какой-либо компилятор или флаг, который может вызвать предупреждение о том, что весь коммутатор не имеет никакого смысла для такого кода?

ОБНОВЛЕНИЕ: Вопрос не о doGoodThing переменной. Речь идет о глупом заявлении switch, который не имеет большого смысла.

ОБНОВЛЕНИЕ 2: Прохождение голосования «dupe», прежде чем вы пометите его как дубликат, - еще раз прочитайте вопрос. Речь идет не о предупреждении отсутствующего заявления «break» после «case». Это о мертвом коде, логических ошибках, статическом семантическом анализе кода компилятором. Мне не нужно предупреждение, если «перерыв» не существует.

+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

В каком смысле это doesn Не имеет смысла? Вы хотите, чтобы компилятор проверял семантическое значение вашего кода? – 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; 
} 

(который предположительно является предполагаемый код здесь) не будет. Один относительно простой способ сделать это - всегда предупреждать о провале, за исключением случая, когда случай пуст. То есть не предупреждайте о провале от случая 1 к случаю 2, потому что между ними нет кода, но предупреждайте о провале от 2 до значения по умолчанию. Однако этот подход все равно будет предупреждать о коде, который может быть преднамеренным.

Более сложным правилом было бы следующее: выдать предупреждение, когда есть назначение переменной x, так что нет возможного пути выполнения, чтобы использовать назначенное значение. То есть во всех возможных путях выполнения, которые включают в себя x, которому присвоено значение v, x будет либо переназначаться на что-то еще, либо выйти из области действия до того, как будет выполнен код, который использует x. Это будет предупреждать о вашем коде, но не фиксированный пример.

Выполнение этого анализа, безусловно, возможно. Однако я не знаю какого-либо компилятора, который в настоящее время делает такой анализ (хотя все это действительно означает, что gcc не работает).

+2

Ура, кто-то, кто по-разному понял вопрос (или я неправильно понял его). – Xeo

+2

«Производить предупреждение всякий раз, когда есть назначение переменной x, так что нет возможного пути выполнения, так что назначенное значение будет использоваться». - Эта! Похоже, довольно очевидная вещь, чтобы обнаружить и предупредить, и gcc уже имеет некоторые предупреждения о неиспользуемых значениях.Я думаю, что оператор switch - это немного красная селедка, потому что это не имеет никакого отношения к анализу, вызвана ли эта проблема оператором switch или какой-либо другой логически эквивалентной вещью, которая также, вероятно, неверна. Например: if (condition) foo = 1; foo = 2; ' –

5

Если вы говорите о недостающем разрыве в инструкции коммутатора, это asked ehancement in GCC.

EDIT 2: если вы используете Java, FindBugs could do it for you

EDIT снова: кажется to detect something related:

избыточного назначение в распределительном заявлении

+0

(+1) собирался опубликовать ту же ссылку. – NPE

+0

Ссылка уже размещена в отмеченном дубликате. –

+0

Это близко, но я использую коммутационные шкафы без перерывов по всему коду. Если gcc начинает давать ложные срабатывания, я просто отключу это предупреждение. Было бы неплохо обнаружить возможные ошибки или мертвый код и предупредить только об этих случаях. Но хороший ответ, спасибо. –

Смежные вопросы