# V768. Variable is of enum type. It is suspicious that it is used as a variable of a Boolean-type.

Анализатор обнаружил подозрительный фрагмент кода, в котором именованная константа из перечисления либо переменная типа перечисления используется как булевое значение. Скорее всего, это свидетельствует о наличии ошибки в логике программы.

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

    enum Offset { left=10, right=15, top=20, bottom=25 };
    void func(Offset offset)
    {
      ....
      if (offset || i < 10)
      {
        ....
      }
    }

В данном случае переменная типа перечисления 'offset' используется как булевое значение, но поскольку в перечислении 'Offset' все значения ненулевые, то условие будет выполняться всегда. Предупреждение анализатора в данном случае подсказывает, что выражение написано неверно и его следует исправить, например, так:

    void func(Offset offset)
    {
      ....
      if (offset == top || i < 10)
      {
        ....
      }
    }

Рассмотрим еще один пример. Пусть у нас имеется перечисление следующего вида:

    enum NodeKind
    {
      NK_Identifier = 64,
      ....
    };

И класс вида

    class Node
    {
    public:
      NodeKind _kind;
      bool IsKind(ptrdiff_t kind) const { return _kind == kind; }
    };

Тогда ошибка может выглядеть следующим образом:

    void foo(Node node)
    {
      if (node.IsKind(!NK_Identifier))
        return;
      ....
     }

Подразумевалось прекращение выполнения функции, если текущий узел не является идентификатором. Но результат выражения '!NK_Identifier' будет равен '0', а перечисление 'NodeKind' не содержит элемента с таким значением. Как итог, метод 'IsKind' всегда будет возвращать значение 'false', и функция продолжит выполнение, независимо от того, чем является текущий узел.

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

    void foo(Node node)
    {
      if (!node.IsKind(NK_Identifier))
        return;
      ....
     }

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

CWE-570 CWE-571

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V768.