V3095. The object was used before it was verified against null. Check lines: N1, N2.
Анализатор обнаружил потенциальную ошибку, которая может привести к доступу по нулевой ссылке.
Анализатор заметил в коде следующую ситуацию. В начале, объект используется. А уже затем этот объект проверяется на null. Это может означать одно из двух:
1) Возникнет ошибка, если объект будет равен null.
2) Программа всегда работает корректно, так как объект всегда не равен null. Проверка является лишней.
Рассмотрим первый вариант. Ошибка есть.
obj = Foo();
result = obj.Func();
if (obj == null) return -1;
Если объект 'obj' окажется равен null, то выражение 'obj.Func()' приведёт к ошибке. Анализатор выдаст предупреждение на этот код, указав 2 строки. Первая строка - это то место, где используется объект. Вторая строка - это то место, где объект сравнивается со значением null.
Исправленный вариант кода:
obj = Foo();
if (obj == null) return -1;
result = obj.Func();
Рассмотрим второй вариант. Ошибки нет.
Stream stream = CreateStream();
while (stream.CanRead)
{
....
}
if (stream != null)
stream.Close();
Этот код всегда работает корректно. Объект stream всегда не равен null. Однако анализатор не разобрался в этой ситуации и выдал предупреждение. Чтобы оно исчезло, следует удалить проверку "if (stream != null)". Она не имеет практического смысла и только может запутать программиста, читающего код.
Исправленный вариант:
Stream stream = CreateStream();
while (stream.CanRead)
{
....
}
stream.Close();
В случае если анализатор ошибается, то кроме изменения кода, можно использовать комментарий для подавления предупреждений. Пример: "obj.Foo(); //-V3095".
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3095. |