﻿# 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\. Проверка является лишней\.

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

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

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

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

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

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

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

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

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

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

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