Есть ли какой-либо компилятор или опция, чтобы вызвать предупреждение для бессмысленного и глючного оператора switch? - PullRequest
4 голосов
/ 16 декабря 2011

С учетом следующего кода:

bool doGoodThing;

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

default:
    doGoodThing = false;
}

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

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

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

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Если вы говорите о пропущенном разрыве в операторе switch, это - запрашиваемое улучшение в GCC .

РЕДАКТИРОВАТЬ 2: если вы используете Java, FindBugs может сделать это для вас

Снова отредактируйте: CPPCheck кажется , чтобы обнаружить что-то связанное :

избыточное назначение в операторе switch

4 голосов
/ 16 декабря 2011

Хорошо, поэтому мы ищем правило, по которому

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 этого не делает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...