﻿# V110\. Implicit type conversion of return value from memsize type to 32\-bit type\.


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

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

Рассмотрим пример\.

```cpp
extern char *begin, *end;
unsigned GetSize() {
  return end - begin;
}
```

Результат выражения "end \- begin" имеет тип 'ptrdiff\_t'\. Но поскольку функция возвращает тип 'unsigned', то происходит [неявное приведение типа](https://pvs-studio.ru/ru/blog/terms/0021/), при котором старшие биты результата теряются\. Таким образом, если указатели 'begin' и 'end' ссылаются на начало и конец массива, по размеру большего 'UINT\_MAX' \(4 Гб\), то функция вернет некорректное значение\.

Исправление должно заключаться в модификации программы таким образом, чтобы размеры массивов хранились и передавались в [memsize](https://pvs-studio.ru/ru/blog/terms/0030/) типах\. Тогда правильный код функции 'GetSize' должен выглядеть следующим образом:

```cpp
extern char *begin, *end;
size_t GetSize() {
  return end - begin;
}
```

В ряде случаев анализатор не выдает предупреждение на приведение типа, если оно явно корректно\. Например, анализатор не выдаст предупреждение на следующий код, где результатом оператора sizeof\(\) хотя и является тип size\_t, но результат безопасно может быть помещен в тип unsigned:

```cpp
unsigned GetSize() {
  return sizeof(double);
}
```

В тех случаях, когда вы точно уверены в корректности кода и неявное приведение типа не влечет ошибок при переходе на 64\-битную архитектуру, вы можете использовать [явное приведение типа](https://pvs-studio.ru/ru/blog/terms/0015/) для того, чтобы избежать вывода диагностических сообщений\. Пример:

```cpp
unsigned GetBitCount() {
  return static_cast<unsigned>(sizeof(TypeRGBA) * 8);
}
```

Если вы подозреваете наличие в своем коде некорректных явных приведений типов возвращаемых значений, на которые анализатор не выдает предупреждения, то вы можете воспользоваться правилом [V202](https://pvs-studio.ru/ru/docs/warnings/v202/)\.

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

1. 64\-битные уроки\. Урок 17\. Паттерн 9\. [Смешанная арифметика](https://pvs-studio.ru/ru/blog/lessons/0017/)\.