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

The analyzer has detected the call of the 'HasFlag' method, that always returns 'true' because the argument value is '0'.

Let's look at the following example:

    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' is an enumeration instance of the 'RuntimeEvent' type. The variable gets the value after the 'GetSupportEvent' method is called. After initialization, 'support' is checked for the flag with a bitwise 'AND' value for 'EndRequest' and 'BeginRequest'.

A check like this makes no sense, because the expression '32 & 2' is zero. If the 'HasFlag' argument is zero, the result of the method call is always 'true'. Therefore, the test passes regardless of the 'support' value. Such code looks suspicious.

The correct version of the check might look as follows:

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

This diagnostic is classified as:

CWE-687

You can look at examples of errors detected by the V3180 diagnostic.