﻿# V3063\. A part of conditional expression is always true/false if it is evaluated\.

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

Рассмотрим пример:

```cpp
uint i = length;
while ((i >= 0) && (n[i] == 0)) i--;
```

Выражение "i \>\= 0" всегда истинно, т\.к\. переменная 'i' имеет тип uint\. Поэтому, если значение 'i' дойдёт до нуля, то цикл while не будет остановлен, и 'i' примет максимальное значение типа uint\. Попытка дальнейшего доступа к массиву 'n' приведёт к исключению OverflowException\.

Корректный код:

```cpp
int i = length;
while ((i >= 0) && (n[i] == 0)) i--;
```

Рассмотрим другой пример:

```cpp
public static double Cos(double d)
{
    // -9223372036854775295 <= d <= 9223372036854775295
    bool expected = !performCheck || 
                    !(-9223372036854775295 <= d || // <=
                      d <= 9223372036854775295);
    if (!expected)
      ....
```

Программист хотел проверить, что переменная d попадает в заданный диапазон \(это видно по комментарию перед проверкой\)\. Но из\-за опечатки он написал оператор '\|\|', вместо оператора '&&'\. Корректный код:

```cpp
bool expected = !performCheck || 
                !(-9223372036854775295 <= d && 
                  d <= 9223372036854775295);
```

Иногда предупреждение V3063 выявляет не ошибку, а просто избыточный код\. Рассмотрим пример:

```cpp
if (@char < 0x20 || @char > 0x7e) {
    if (@char > 0x7e
        || (@char >= 0x01 && @char <= 0x08)
        || (@char >= 0x0e && @char <= 0x1f)
        || @char == 0x27
        || @char == 0x2d)
```

Анализатор предупредит, что подвыражения @char \=\= 0x27 и @char \=\= 0x2d всегда ложны из\-за предшествующего оператора if\. Этот код может быть вполне корректен\. Однако он избыточен, и лучше его упростить\. Это сделает программу более простой для понимания другими разработчиками\.

Упрощенный вариант кода:

```cpp
if (@char < 0x20 || @char > 0x7e) {
    if (@char > 0x7e
        || (@char >= 0x01 && @char <= 0x08)
        || (@char >= 0x0e && @char <= 0x1f))
```