# V566. Integer constant is converted to pointer. Check for an error or bad coding style.

Анализатор обнаружил явное приведение числового значения к типу указателя. Чаще всего это предупреждение выдается для участков кода, где числа используются как статус состояния объекта. Подобные приемы не всегда являются ошибкой, но, как правило, свидетельствуют о плохом дизайне.

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

    const DWORD SHELL_VERSION = 0x4110400;
    ...
    char *ptr = (char*) SHELL_VERSION;
    ...
    if (ptr == (char*) SHELL_VERSION)

В указателе сохраняется константное значение, которое отмечает некоторое специальное состояние. Подобный код может долгое время успешно работать. Но если будет создан объект по адресу 0x4110400, то не будет возможность отличить, это магический флаг или просто объект. Если хочется использовать специальный флаг, то лучше написать так:

    const DWORD SHELL_VERSION = 0x4110400;
    ...
    char *ptr = (char*)(&SHELL_VERSION);
    ...
    if (ptr == (char*)(&SHELL_VERSION))

Примечание. Чтобы сократить количество ложных срабатываний, сообщение V566 не выдается в целом ряде случаев. Например, если магическим числом являются такие значения, как: -1, 0, 0xcccccccc, 0xdeadbeef. Предупреждение не выдается, если число лежит в диапазоне от 0 до 65535 и приводится к указателю на строку. Это позволяет пропустить корректный код следующего вида:

    CString sMessage( (LPCSTR)IDS_FILE_WAS_CHANGED ) ;

Подобный способ загрузки строки из ресурсов достаточно распространен, хотя, конечно, лучше использовать MAKEINTRESOURCE. Есть и другие исключения.

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

CWE-587 CERT-INT36-C