Анализатор обнаружил вызов метода '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. |