﻿# V112\. Dangerous magic number N used\.


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

Анализатор обнаружил использование опасной магической константы\. Потенциальная ошибка может заключаться в использовании числовой константы в качестве специальных значений или размера memsize типа\.

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

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

```cpp
size_t ArraySize = N * 4;
size_t *Array = (size_t *)malloc(ArraySize);
```

Программист при написании программы полагался на то, что размер 'size\_t' всегда будет равен 4 и записал вычисление размера массива как "N \* 4"\. Данный код не учитывает, что тип 'size\_t' на 64\-битной системе будет занимать 8 байт и выделит меньшее количество памяти, чем необходимо\. Исправление кода заключается в использовании оператора 'sizeof' вместо константы 4\.

```cpp
size_t ArraySize = N * sizeof(size_t);
size_t *Array = (size_t *)malloc(ArraySize);
```

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

```cpp
size_t n = static_cast<size_t>(-1);
if (n == 0xffffffffu) { ... }
```

Иногда в качестве кода ошибки или другого специального маркера используют значение "\-1", записывая его как "0xffffffff"\. На 64\-битной платформе записанное выражение некорректно, и следует явно использовать значение "\-1"\.

```cpp
size_t n = static_cast<size_t>(-1);
if (n == static_cast<size_t>(-1)) { ... }
```

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

![V112_ru/image1.png](https://import.viva64.com/docx/blog/V112_ru/image1.png)

Следует внимательно изучить код на наличия магических констант и заменить их безопасными константами и выражениями\. Для этого можно использовать оператор 'sizeof\(\)', специальные значения из <limits\.h\>, <inttypes\.h\> и так далее\.

В ряде случаев использование магических констант не считается опасным\. Например, на данный код предупреждение выдано не будет:

```cpp
float Color[4];
```

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

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