﻿# V207\. A 32\-bit variable is utilized as a reference to a pointer\. A write outside the bounds of this variable may occur\.


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

Предупреждение информирует о наличии явного приведения 32\-битной целочисленной переменной к типу ссылки на указатель\.

Рассмотрим простой синтетический пример:

```cpp
int A;
(int *&)A = pointer;
```

По какой\-то причине в переменную типа 'int' следует поместить указатель\. Чтобы это сделать, можно привести тип переменной 'A' к типу 'int \*&' \(ссылка на указатель\)\.

Этот код волне работоспособен в 32\-битной системе, так как размеры переменной 'int' и указателей совпадают\. В 64\-битной системе произойдёт запись за границу памяти, которую занимает переменная 'A', и дальнейшее поведение программы будет неопределено\.

Чтобы исправить ошибку, следует использовать один из [memsize\-типов](https://pvs-studio.ru/ru/blog/terms/0030/) данных\. Например, можно использовать тип [intptr\_t](https://pvs-studio.ru/ru/blog/terms/0023/):

```cpp
intptr_t A;
(intptr_t *&)A = pointer;
```



Рассмотрим более сложный пример\. Пример, составленный на основе кода, взятого из реального приложения:

```cpp
enum MyEnum { VAL1, VAL2 };
void Get(void*& data) {
  static int value;
  data = &value;
}
void M() {
  MyEnum e;
  Get((void*&)e);
  ....
}
```

Есть функция, которая возвращает значения, имеющие тип указателя\. В одном месте полученное значение помещается в переменную типа 'enum'\. Оставим в стороне, почему так было сделано\. Нам важно, что этот код корректно работал, когда был 32\-битным\. Однако 64\-битный вариант программы ведёт себя некорректно\. Функция Get\(\) меняет не только переменную 'e', но и память по соседству\.