﻿# V3093\. The operator evaluates both operands\. Perhaps a short\-circuit operator should be used instead\.

Анализатор обнаружил возможную ошибку, связанную с тем, что в логическом выражении перепутаны операторы & и && или \| и \|\|\.

Условные операторы И \(&&\) / ИЛИ \(\|\|\) вычисляют второй операнд при необходимости \(см\. [Short circuit](https://en.wikipedia.org/wiki/Short-circuit_evaluation)\), в то время как операторы & и \| всегда вычисляют оба операнда\. Возможно, программист не планировал такое выполнение кода\.

Рассмотрим пример некорректного кода:

```cpp
if ((i < a.m_length) & (a[i] % 2 == 0))
{
  sum += a[i];
}
```

Пусть объект 'a' это некий контейнер\. Количество элементов в этом контейнере хранится в члене 'm\_length'\. Необходимо вычислить суммы чётных элементов, при этом надо контролировать, чтобы не выйти за границу массива\.

Из\-за опечатки, использовали не оператор '&&', а '&'\. В результате, если индекс 'i' будет больше или равен 'a\.m\_length', произойдёт выход за границу массива при вычислении подвыражения \(a\[i\] % 2 \=\= 0\)\. Независимо от того, истина или ложна левая часть выражения, правая часть в любом случае вычисляется\.

Корректный вариант кода:

```cpp
if ((i < a. m_length) && (a[i] % 2 == 0))
{
  sum += a[i];
}
```

Ещё один пример некорректного кода может выглядеть следующим образом:

```cpp
if (x > 0 | BoolFunc())
{
  ....
}
```

Вызов функции 'BoolFunc\(\)' будет выполнен всегда, даже если условие '\(x \> 0\)' будет истинным\.

Корректный вариант кода:

```cpp
if (x > 0 || BoolFunc())
{
  ....
}
```

Участки кода, выявленные с помощью диагностического правила V3093, не всегда могут содержать серьёзные ошибки, но часто выражения являются неоптимальными с точки зрения производительности \(особенно, если в выражении вызываются сложные функции\)\.

Если же условное выражение записано так, как был задумано разработчиком, то можно пометить это место комментарием специального вида "//\-V3093" и анализатор в дальнейшем не будет выдавать это предупреждение:

```cpp
if (x > 0 | BoolFunc()) //-V3093
{
  ....
}
```

Все способы подавления ложных предупреждений описаны в [документации](https://pvs-studio.ru/ru/docs/manual/0017/)\.