﻿# V3095\. The object was used before it was verified against null\. Check lines: N1, N2\.

Анализатор обнаружил потенциальную ошибку, которая может привести к доступу по нулевой ссылке\.

Анализатор заметил в коде следующую ситуацию\. В начале, объект используется\. А уже затем этот объект проверяется на null\. Это может означать одно из двух:

1\) Возникнет ошибка, если объект будет равен null\.

2\) Программа всегда работает корректно, так как объект всегда не равен null\. Проверка является лишней\.



Рассмотрим первый вариант\. Ошибка есть\.

```cpp
obj = Foo();
result = obj.Func();
if (obj == null) return -1;
```

Если объект 'obj' окажется равен null, то выражение 'obj\.Func\(\)' приведёт к ошибке\. Анализатор выдаст предупреждение на этот код, указав 2 строки\. Первая строка \- это то место, где используется объект\. Вторая строка \- это то место, где объект сравнивается со значением null\.

Исправленный вариант кода:

```cpp
obj = Foo();
if (obj == null) return -1;
result = obj.Func();
```

Рассмотрим второй вариант\. Ошибки нет\.

```cpp
Stream stream = CreateStream();
while (stream.CanRead)
{
  ....
}
if (stream != null)
  stream.Close();
```

Этот код всегда работает корректно\. Объект stream всегда не равен null\. Однако анализатор не разобрался в этой ситуации и выдал предупреждение\. Чтобы оно исчезло, следует удалить проверку "if \(stream \!\= null\)"\. Она не имеет практического смысла и только может запутать программиста, читающего код\.

Исправленный вариант:

```cpp
Stream stream = CreateStream();
while (stream.CanRead)
{
  ....
}
stream.Close();
```

В случае если анализатор ошибается, то кроме изменения кода, можно использовать комментарий для подавления предупреждений\. Пример: "obj\.Foo\(\); //\-V3095"\.