﻿# V114\. Dangerous explicit type pointer conversion\.


> Это правило входит в группу "Диагностика 64\\\-битных ошибок"\\\. Разработка правил этой группы больше не ведётся, и в будущем они могут быть отключены\\\. Если вы используете эти правила, \[свяжитесь с нашей поддержкой\]\(https://pvs\-studio\.ru/ru/about\-feedback/\) — мы поможем найти замену или предложим альтернативное решение\\\.

Анализатор обнаружил потенциально возможную ошибку, связанную с опасным явным приведением указателя одного типа к указателю другого типа\. Ошибка может заключаться в некорректной работе с объектами, на которые ссылается указатель\. 

Рассмотрим пример\. В нем присутствует явное приведение указателя на 'int' к указателю на 'size\_t'\.

```cpp
int array[4] = { 1, 2, 3, 4 };
size_t *sizetPtr = (size_t *)(array);
cout << sizetPtr[1] << endl;
```

Как видите, результат вывода программы отличается в 32\-битном и 64\-битном варианте\. На 32\-битной системе доступ к элементам массива осуществляется корректно, так как размеры типов 'size\_t' и 'int' совпадают, и мы видим вывод "2"\. На 64\-битной системы мы получили в выводе "17179869187", так как именно значение 17179869187 находится в 1\-ом элементе массива 'sizetPtr'\.

Исправление описанной ситуации заключается в отказе от опасных приведений типов путем модернизации программы\. Другим вариантом является создание нового массива и копирование в него значений из исходного массива\.

Естественно, не все явные приведения типов указателей являются опасными\. В показанном далее примере результат работы не зависит он разрядности системы, так как типы 'enum' и 'int' имеют одинаковый размер как на 32\-битной, так и на 64\-битной системе\. Соответственно анализатор не выдаст на данный код никаких сообщений\.

```cpp
int array[4] = { 1, 2, 3, 4 };
enum ENumbers { ZERO, ONE, TWO, THREE, FOUR };
ENumbers *enumPtr = (ENumbers *)(array);
cout << enumPtr[1] << endl;
```

Дополнительные материалы по данной теме:

1. 64\-битные уроки\. Урок 14\. Паттерн 6\.  [Изменение типа массива](https://pvs-studio.ru/ru/blog/lessons/0014/)\.
1. 64\-битные уроки\. Урок 15\. Паттерн 7\. [Упаковка указателей](https://pvs-studio.ru/ru/blog/lessons/0015/)\.