V6002. The switch statement does not cover all values of the enum.
Анализатор обнаружил оператор 'switch', в котором выбор варианта осуществляется по переменной enum-типа. При этом в операторе 'switch' используются не все элементы перечисления, что может свидетельствовать о наличии ошибки.
Пример кода, в котором встретилась эта ошибка:
enum Fruit { APPLE, BANANA, PEAR, PINEAPPLE, ORANGE }
int SomeMethod(Fruit fruit)
{
int res = 0;
switch (fruit)
{
case APPLE:
res = calculate(10); break;
case BANANA:
res = calculate(20); break;
case PEAR:
res = calculate(30); break;
case PINEAPPLE:
res = calculate(40); break;
}
// code
return res;
}
В данном случае перечисление 'Fruit' содержит 5 именованных констант, а оператор 'switch', выбор в котором осуществляется по данному перечислению, реализует выбор только по 4 из них. Это место является потенциально ошибочным.
Возможно, в ходе рефакторинга в перечисление добавили новую константу, но забыли реализовать выбор по ней в операторе 'switch', или же, что может быть в случае с большими перечислениями, константу банально могли пропустить. В итоге пропущенное значение обрабатывается неправильно.
Тогда корректный код мог бы выглядеть следующим образом:
int SomeMethod(Fruit fruit)
{
int res = 0;
switch (fruit)
{
case APPLE:
res = calculate(10); break;
case BANANA:
res = calculate(20); break;
case PEAR:
res = calculate(30); break;
case PINEAPPLE:
res = calculate(40); break;
case ORANGE:
res = calculate(50); break;
}
// code
return res;
}
Анализатор выдает предупреждение далеко не всегда, когда в 'switch' используется не все константы из перечисления. Иначе, было бы слишком много ложных срабатываний. Действует целый ряд исключений эмпирического типа. Основные:
- Есть dafault-ветка;
- Отсутствующая константа содержит в имени: None, Unknown и т.п.
- Отсутствующая константа самая последняя в enum и содержит в имени "end", "num", "count" и т.п.
- В перечислении всего 1 или 2 константы;
- И так далее.
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6002. |