﻿# V647\. Value of 'A' type is assigned to a pointer of 'B' type\.

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

Рассмотрим пример некорректного кода:

```cpp
void foo()
{
  int *a = GetPtr();
  int b = 10;
  a = b;             // <=
  Foo(a);
}
```

В данном случае указателю 'a' будет присвоено значение 10\. Фактически мы получим не валидный указатель\. Для исправления следует разыменовать указатель 'a' или взять адрес переменной 'b'\.

Корректный вариант кода:

```cpp
void foo()
{
  int *a = GetPtr();
  int b = 10;
  *a = b;
  Foo(a);
}
```

Так же корректным будет такой код:

```cpp
void foo()
{
  int *a = GetPtr();
  int b = 10;
  a = &b;
  Foo(a);
}
```

Анализатор считает безопасным, когда в переменную типа указатель записываются такие магические значения, как: \-1, 0xcccccccc, 0xbadbeef, 0xdeadbeef, 0xfeeefeee, 0xcdcdcdcd и т\.д\. Эти значения часто используются в целях отладки или как специальные маркеры\.

**Примечание N1\.**

Подобная ошибка возможна только в языке Си\. В Си\+\+ неявное приведение целочисленного значения \(кроме 0\) к указателю невозможно\.

**Примечание N2\.**

Иногда сообщения анализатора могут казаться странными\. Рассмотрим такой случай:

```cpp
char *page_range_split = strtok(page_range, ",");
```

Анализатор выдаёт предупреждение, что значение типа 'int' помещается в указатель\. Но ведь функция 'strtok' возвращает указатель, как же так?

Дело в том, что функция 'strtok' может быть не объявлена ранее\! Разработчик мог забыть подключить нужный заголовочный файл\. В языке C считается, что по умолчанию функция возвращает тип 'int'\. Именно исходя из этих предположений и будет скомпилирован код\. Это серьёзная ошибка, которая будет приводить к порче указателей в 64\-битных программах\. Подробнее эта тема разбирается в статье "[Красивая 64\-битная ошибка на языке Си](https://pvs-studio.ru/ru/blog/posts/cpp/0033/)"\.