# V6067. Two or more case-branches perform the same actions.

Анализатор обнаружил ситуацию, когда в операторе switch разные метки case содержат одинаковые фрагменты кода. Часто это свидетельствует об избыточном коде, который можно улучшить объединением меток. Но нередко одинаковые фрагменты кода могут быть причиной copy-paste программирования и являться настоящими ошибками.

Рассмотрим пример с избыточным кодом:

    public static String getSymmetricCipherName(SymmetricKeyAlgorithmTags tag)
    {
        switch (tag)
        {
            case DES:
                return "DES";
            case AES_128:
                return "AES";
            case AES_192:
                return "AES";
            case AES_256:
                return "AES";
            case CAMELLIA_128:
                return "Camellia";
            case CAMELLIA_192:
                return "Camellia";
            case CAMELLIA_256:
                return "Camellia";
            case TWOFISH:
                return "Twofish";
            default:
                throw new IllegalArgumentException("....");
        }
    }

В реальных проектах для различных case'ов возможны случаи, когда необходимо выполнить одинаковые действия. И для того, чтобы выглядело читабельнее, код можно написать более компактно:

    public static String getSymmetricCipherName(SymmetricKeyAlgorithmTags tag)
    {
        switch (tag)
        {
            case DES:
                return "DES";
            case AES_128:
            case AES_192:
            case AES_256:
                return "AES";
            case CAMELLIA_128:
            case CAMELLIA_192:
            case CAMELLIA_256:
                return "Camellia";
            case TWOFISH:
                return "Twofish";
            default:
                throw new IllegalArgumentException("....");
        }
    }

Рассмотрим пример из реального приложения, где разработчик допустил ошибку из-за опечатки:

    protected boolean condition(Actor actor) throws ....
    {
      ....
      if (fieldValue instanceof Number)
      {
        ....
        switch (tokens[2])
        {
          case "=":
          case "==":
            passing = (Double) fieldValue
                      ==
                      Double.parseDouble(secondValue);
            break;
          case "!":
          case "!=":
            passing = (Double) fieldValue
                      ==
                      Double.parseDouble(secondValue);
            break;
          case "<=":
            passing = ((Number) fieldValue).doubleValue()
                      <=
                      Double.parseDouble(secondValue);
            break;
          ....
        }
       ....
      }
      ....
    }

В коде меток '!' и '!=' допущена опечатка, которая возникла по всей видимости из-за copy-paste. Просмотрев остальные ветви case, можно прийти к выводу, что следовало использовать оператор сравнения '!=' вместо '=='.

Исправленный код:

    protected boolean condition(Actor actor) throws ....
    {
      ....
      if (fieldValue instanceof Number)
      {
        ....
        switch (tokens[2])
        {
          case "=":
          case "==":
            passing = (Double) fieldValue
                      ==
                      Double.parseDouble(secondValue);
            break;
          case "!":
          case "!=":
            passing = (Double) fieldValue
                      !=
                      Double.parseDouble(secondValue);
            break;
          case "<=":
            passing = ((Number) fieldValue).doubleValue()
                      <=
                      Double.parseDouble(secondValue);
            break;
          ....
        }
       ....
      }
      ....
    }

Данная диагностика классифицируется как:

CWE-691

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6067.