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

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

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

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

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

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

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

    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]. Тогда корректный код должен быть таким:

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

Данная диагностика классифицируется как:

CWE-682

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1063.