﻿# V109\. Implicit type conversion of return value to memsize type\.


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

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

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

```cpp
extern int Width, Height, Depth;
size_t GetIndex(int x, int y, int z) {
  return x + y * Width + z * Width * Height;
}
...
array[GetIndex(x, y, z)] = 0.0f;
```

В случае работы с большими массивами \(более 'INT\_MAX' элементов\) данный код будет вести себя некорректно, и мы будет адресоваться не к тем элементам массива 'array', к которым рассчитываем\. Но анализатор не выдаст предупреждение на строчку "array\[GetIndex\(x, y, z\)\] \= 0\.0f;",так как она совершенно корректна\. Анализатор информирует о потенциальной ошибке внутри функции и совершенно прав, так как ошибка находится именно там и связана с арифметическим переполнением\. Несмотря на то, что мы возвращаем значение типа 'size\_t', выражение "x \+ y \* Width \+ z \* Width \* Height" вычисляется с использованием типа 'int'\.

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

```cpp
extern int Width, Height, Depth;
size_t GetIndex(int x, int y, int z) {
  return (size_t)(x) +
(size_t)(y) * (size_t)(Width) +
(size_t)(z) * (size_t)(Width) * (size_t)(Height);
}
```

Другим вариантом исправления является использование других типов для переменных, участвующих в выражении\.

```cpp
extern size_t Width, Height, Depth;
size_t GetIndex(size_t x, size_t y, size_t z) {
  return x + y * Width + z * Width * Height;
}
```

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

```cpp
DWORD_PTR Calc(unsigned a) {
  return (DWORD_PTR)(10 * a);
}
```

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

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

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