Хорошо, поэтому мы ищем правило, по которому
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 этого не делает).