﻿# V118\. malloc\(\) function accepts a dangerous expression in the capacity of an argument\.


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

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

Анализатор считает подозрительными те выражения, в которых присутствуют константные литералы кратные четырем, но отсутствует оператор sizeof\(\)\.

Пример первый\.

Некорректный код выделения памяти для матрицы размером 3x3 из элементов типа size\_t может выглядеть следующим образом:

```cpp
size_t *pMatrix = (size_t *)malloc(36); // V118
```

Хотя такой код мог долгое время надежно работать в 32\-битной системе, использование магического числа 36 некорректно\. При компиляции 64\-битной версии необходимо выделить уже 72 байта памяти\. Исправление заключается в использовании оператора sizeof \(\):

```cpp
size_t *pMatrix = (size_t *)malloc(9 * sizeof(size_t));
```

Второй пример\.

Некорректен для 64\-битной системы и следующий код, основанный на предположении, что размер структуры Item равен 12 байт:

```cpp
struct Item {
  int m_a;
  int m_b;
  Item *m_pParent;
};
Item *items = (Item *)malloc(GetArraySize() * 12); // V118
```

Исправление также заключается в использовании оператора sizeof\(\) для корректного вычисления размера структуры:

```cpp
Item *items = (Item *)malloc(GetArraySize() * sizeof(Item));
```

Приведенные ошибки просты и легки в исправлении\. Но от этого они не менее опасны и сложны для поиска в больших приложениях\. Именно поэтому диагностика подобных ошибок реализована в виде отдельного правила\.

Наличие константы в выражении, являющегося параметром для функции malloc\(\), вовсе не означает, что на него всегда выдается предупреждение V118\. Если в выражении участвует оператор sizeof\(\), то такая конструкция считается безопасной\. Пример кода, считающийся анализатором безопасным:

```cpp
int *items = (int *)malloc(sizeof(int) * 12);
```

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

1. 64\-битные уроки\. Урок 9\. Паттерн 1\. [Магические числа](https://pvs-studio.ru/ru/blog/lessons/0009/)\.