# V608. Recurring sequence of explicit type casts.

Анализатор обнаружил повторяющиеся последовательности, состоящие из операторов явного приведения типов. Как правило, подобный код появляется из-за опечаток и не приводит к возникновению ошибок. Однако разумно проверить фрагменты кода, где анализатор выдает предупреждение V608. Возможно, ошибка всё-таки есть. Или, по крайней мере, код можно упростить.

Рассмотрим пример:

    m_hIcon = AfxGetApp()->LoadStandardIcon(
      MAKEINTRESOURCE(IDI_ASTERISK));

Анализатор выдаст предупреждение: V608 "Recurring sequence of explicit type casts: (LPSTR)(ULONG_PTR)(WORD) (LPSTR)(ULONG_PTR)(WORD)."

Давайте разберемся, откуда взялись две цепочки "(LPSTR)(ULONG_PTR)(WORD)".

Константное значение IDI_ASTERISK представляет собой макрос вида:

    #define IDI_ASTERISK MAKEINTRESOURCE(32516)

Это значит, что приведенный выше код эквивалентен этому:

    m_hIcon = AfxGetApp()->LoadStandardIcon(
      MAKEINTRESOURCE(MAKEINTRESOURCE(32516)));

Макрос MAKEINTRESOURCE разворачивается в (LPSTR)((DWORD)((WORD)(i))). В результате получается следующая последовательность:

    m_hIcon = AfxGetApp()->LoadStandardIcon(
      (LPSTR)((DWORD)((WORD)((LPSTR)((DWORD)((WORD)((32516))))))
    );

Этот код будет корректно работать, но он избыточен. Код можно переписать без лишних приведений типов:

    m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_ASTERISK);

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

CWE-704