Анализатор обнаружил странное выражение, в котором производится деление по модулю 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;
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1063. |