# V3151. Potential division by zero. Variable was used as a divisor before it was compared to zero. Check lines: N1, N2.

Анализатор обнаружил потенциальную ошибку, которая может привести к делению на ноль.

Анализатор заметил в коде следующую ситуацию. Сначала происходит деление на некоторую переменную. Затем эта переменная сравнивается с нулём. Это может означать одно из двух:

1) Возникнет ошибка, если число будет равно 0.

2) Программа всегда работает корректно, так как число всегда не равно 0. Проверка является лишней.

Рассмотрим пример кода, на который выдаётся предупреждение анализатора.

```
int Foo(int num)
{
result = 1 / num;
if (num == 0) return -1;
....
}
```

Если число 'num' окажется равно нулю, то выражение '1 / num' приведёт к ошибке. Анализатор выдаст предупреждение на этот код, указав 2 строки. Первая строка - это то место, где происходит деление на число. Вторая строка - это то место, где число сравнивается с нулём.

Исправленный вариант кода:

```
int Foo(int num)
{
if (num == 0) return -1;
result = 1 / num;
....
}
```

Рассмотрим второй вариант срабатывания, в котором нет ошибки, а проверка на ноль избыточна.

```
int num = MyOneTenRandom();
result = 1 % num;
if (num == 0) return -1;
```

Этот код всегда работает корректно. Функция 'MyOneTenRandom' написана так, что никогда не возвращает ноль. Однако анализатор не разобрался в этой ситуации (например, если этот метод виртуальный и межпроцедурный анализ не смог выбрать, какая именно в runtime'е реализация метода будет вызвана), и выдал предупреждение. Чтобы оно исчезло, следует удалить проверку "if (num == 0)". Она не имеет практического смысла и может только запутать программиста, читающего данный код.

Исправленный вариант:

```
int num = MyOneTenRandom();
result = 1 % num;
```

В случае если анализатор ошибается, то, кроме изменения кода, можно использовать комментарий для подавления предупреждений. Пример: "1 % num; //-V3151".

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