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

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

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

```cpp
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'\. Такой код выглядит подозрительно\.

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

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