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

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

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

    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'.

Для исправления ошибки следует использовать явное приведение всех переменных участвующих в выражении к memsize типам.

    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);
    }

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

    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;
    }

В тех случаях, когда вы точно уверены в корректности кода, и неявное приведение типа не влечет ошибок при переходе на 64-битную архитектуру, вы можете использовать явное приведение типа для того, чтобы избежать вывода диагностических сообщений в этой строке. Пример:

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

В том случае, если вы подозреваете, наличие в своем коде некорректных явных приведений к memsize типам, на которые анализатор не выдает предупреждения, то вы можете воспользоваться правилом V201.

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

- 64-битные уроки. Урок 17. Паттерн 9. Смешанная арифметика.