﻿# V121\. Implicit conversion of the type of 'new' operator's argument to size\_t type\.


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

Анализатор обнаружил потенциально возможную ошибку, связанную с вызовом оператора new\. В качестве аргумента оператору new передается значение не memsize\-типа\. Оператор new принимает значения типа size\_t и передача 32\-битного фактического аргумента может свидетельствовать о наличии ошибки переполнения при вычислении объема выделяемой памяти\.

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

```cpp
unsigned a = 5;
unsigned b = 1024;
unsigned c = 1024;
unsigned d = 1024;
char *ptr = new char[a*b*c*d]; //V121
```

В данном случае происходит переполнение при вычислении выражения "a\*b\*c\*d" и в результате программа выделит меньшее количество памяти, чем планировалось\. Исправление заключается в использовании типа size\_t:

```cpp
size_t a = 5;
size_t b = 1024;
size_t c = 1024;
size_t d = 1024;
char *ptr = new char[a*b*c*d]; //Ok
```

Ошибка не будет диагностироваться, если значение задано безопасным 32\-битным константным значением\. Пример безопасного кода:

```cpp
char *ptr = new char[100]; 
const int size = 3*3;
char *p2 = new char[size];
```

Родственным диагностическим сообщением являются [V106](https://pvs-studio.ru/ru/docs/warnings/v106/)\.

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

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