V3146. Possible null dereference. A method can return default null value.
Анализатор обнаружил небезопасное использование результата вызова одного из методов библиотеки System.Enumerable, которые могут вернуть 'default' значение.
Примеры таких методов: 'FirstOrDefault', 'LastOrDefault', 'SingleOrDefault' и 'ElementAtOrDefault'. Эти методы возвращают значение по умолчанию, если в массиве нет ни одного объекта, удовлетворяющего предикату поиска. Значением по умолчанию для ссылочных типов является пустая ссылка (null). Соответственно, прежде чем использовать полученную ссылку, её следует проверить.
Пример опасного разыменования:
public void TestMemberAccess(List<string> t)
{
t.FirstOrDefault(x => x == "Test message").ToString();
}
В этом случае стоит добавить проверку возвращаемого элемента на null:
public void TestMemberAccess(List<string> t)
{
t.FirstOrDefault(x => x == "Test message")?.ToString();
}
Повышенную опасность методы, возвращающие default значения, представляют в цепочках вызовов. Пример из открытого проекта:
public IViewCompiler GetCompiler()
{
....
_compiler = _services
.GetServices<IViewCompilerProvider>()
.FirstOrDefault()
.GetCompiler();
}
....
return _compiler;
}
Если вы уверены, что при обработке массива в нём есть нужный вам элемент – мы советуем использовать метод, не возвращающий default значение:
public IViewCompiler GetCompiler()
{
....
_compiler = _services
.GetServices<IViewCompilerProvider>()
.First()
.GetCompiler();
}
....
return _compiler;
}
В этом случае в случае ошибки вы получите не 'NullReferenceException', а 'InvalidOperationException' с более понятным сообщением: "Sequence contains no elements".
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3146. |