﻿# V1063\. The modulo by 1 operation is meaningless\. The result will always be zero\.

Анализатор обнаружил странное выражение, в котором производится деление по модулю 1\. Результатом такого выражения всегда будет 0\.

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

```cpp
if (x % 1 == 1)
{
    ....
}
```

Здесь переменную 'x' поделили по модулю '1', и теперь вне зависимости от значения 'x' выражение 'x % 1' всегда будет равно 0\. Следовательно, условие всегда будет ложным\. Наиболее вероятно, что переменную 'x' следовало поделить по модулю '2':

```cpp
if (x % 2 == 1)
{
    ....
}
```

Рассмотрим пример из реального проекта \(stickies\):

```cpp
void init (....)
{
  srand(GetTickCount() + rand());

  updateFreq1 = (rand() % 1) + 1;
  updateFreq2 = (rand() % 1) + 1;
  updateFreq3 = (rand() % 1) + 1;
  updateFreq4 = (rand() % 1) + 1;

  waveFreq1 = (rand() % 15);
  waveFreq2 = (rand() % 3);
  waveFreq3 = (rand() % 16);
  waveFreq4 = (rand() % 4);
  // ....
}
```

Здесь переменные 'updateFreq1', 'updateFreq2', 'updateFreq3' и 'updateFreq4' будут всегда инициализированы значением 1\. Возможно, что каждая переменная вероятно должна была быть проинициализирована каким\-то псевдослучайным числом\. И скорее всего, это \[1\.\.2\]\. Тогда корректный код должен быть таким:

```cpp
updateFreq1 = (rand() % 2) + 1;
updateFreq2 = (rand() % 2) + 1;
updateFreq3 = (rand() % 2) + 1;
updateFreq4 = (rand() % 2) + 1;
```