# V3180. The 'HasFlag' method always returns 'true' because the value '0' is passed as its argument.

Анализатор обнаружил вызов метода 'HasFlag', который всегда возвращает 'true' из-за аргумента, равного '0'.

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

    public enum RuntimeEvent
    {
      Initialize = 1,
      BeginRequest = 2,
      BeginSessionAccess = 4,
      ExecuteResource = 8,
      EndSessionAccess = 16,
      EndRequest = 32
    }

    public void FlagsTest()
    {
      ....
      RuntimeEvent support = GetSupportEvent();
      ....
      Assert.True(support.HasFlag(  RuntimeEvent.EndRequest
                                  & RuntimeEvent.BeginRequest),
                  "End|Begin in End|SessionEnd");
      ....
    }

'support' – экземпляр перечисления типа 'RuntimeEvent'. Значение переменной – результат вызова метода 'GetSupportEvent'. После инициализации у 'support' проверяют наличие флага со значением побитового 'И' для 'EndRequest' и 'BeginRequest'.

Подобная проверка не имеет смысла, так как выражение '32 & 2' равно нулю. Если аргумент 'HasFlag' – ноль, то результатом вызова метода всегда будет 'true'. Получается, что тест проходит, независимо от значения 'support'. Такой код выглядит подозрительно.

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

    public void FlagsTest()
    {
      ....
      RuntimeEvent support = GetSupportEvent();
      ....
      Assert.True(support.HasFlag(  RuntimeEvent.EndRequest
                                  | RuntimeEvent.BeginRequest),
                  "End|Begin in End|SessionEnd");
      ....
    }

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

CWE-687

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