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

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

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

    switch (wParam)
    {
    case WM_MOUSEMOVE:
      ::PostMessage(hWndServer, wParam, 0, 0);
      break;
    case WM_NCMOUSEMOVE:
      ::PostMessage(hWndServer, wParam, 0, 0);
      break;
    ....
    default:
      break
    }

Действия для нескольких событий мыши действительно могут быть одинаковыми, поэтому код можно написать более компактно:

    switch (wParam)
    {
    case WM_MOUSEMOVE:
    case WM_NCMOUSEMOVE:
      ::PostMessage(hWndServer, wParam, 0, 0);
      break;
    ....
    default:
      break
    }

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

    GLOBAL(void)
    jpeg_default_colorspace (j_compress_ptr cinfo)
    {
      switch (cinfo->in_color_space) {
      case JCS_GRAYSCALE:
        jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
        break;
      case JCS_RGB:
        jpeg_set_colorspace(cinfo, JCS_YCbCr);
        break;
      case JCS_YCbCr:
        jpeg_set_colorspace(cinfo, JCS_YCbCr);
        break;
      ....
      }
      ....
    }

В коде метки JCS_RGB допущена опечатка. Следовало передавать в функцию значение JCS_RGB, а не JCS_YCbCr.

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

    GLOBAL(void)
    jpeg_default_colorspace (j_compress_ptr cinfo)
    {
      switch (cinfo->in_color_space) {
      case JCS_GRAYSCALE:
        jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
        break;
      case JCS_RGB:
        jpeg_set_colorspace(cinfo, JCS_RGB);
        break;
      case JCS_YCbCr:
        jpeg_set_colorspace(cinfo, JCS_YCbCr);
        break;
      ....
      }
      ....
    }

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

CWE-691

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