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");
....
}
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3180. |