﻿# V8023\. It is possible that a wrong variable of the 'error' type is checked for 'nil'\.

Анализатор обнаружил код, в котором на nil проверяется не та переменная типа error\. Из\-за частого использования и схожести в названиях переменных типа error возрастает риск допустить ошибку при работе с ними\. 

Рассмотрим пример:

```cpp
func decodeUser(data []byte) (err error) {
  var u map[string] any

  if e := json.Unmarshal(data, &u); err != nil {
    return e
  }

  ....
}
```

Результат вызова `json.Unmarshal(data, &u)` присваивается переменной `e`\. Однако в условии проверяется именованное возвращаемое значение `err`\. Следовательно, результат `json.Unmarshal(data, &u)` не проверяется вообще, а на выход из функции влияет другое значение\.

Для исправления в `if` нужно проверить `e`:

```cpp
func decodeUser(data []byte) (err error) {
  var u map[string] any

  if e := json.Unmarshal(data, &u); e != nil {
   return e
  }

  ....
}
```

Рассмотрим ещё один пример с ошибкой:

```cpp
func decodeUser(data []byte) error {
  var u map[string] any

  e := validatePayload(data)

  if e != nil {
    return e
  }

  err := json.Unmarshal(data, &u)
  if e != nil {
    e = err
  }

  ....
}
```

Параметр `data` перед использованием проверяется с помощью функции `validatePayload`\. Если данные содержат ошибку, выполнение функции прекращается\. В противном случае результат вызова `json.Unmarshal(data, &u)` присваивается переменной `err`, после чего снова проверяется `e`\. Если при выполнении `json.Unmarshal(data, &u)` возникла ошибка, информация об этом не будет перезаписана\.

Для исправления в `if` нужно проверить `err`:

```cpp
func decodeUser(data []byte) error {
  var u map[string]any

  e := validatePayload(data)

  if e != nil {
    return e
  }

  err := json.Unmarshal(data, &u)
  if err != nil {
    e = err
  }

  ....
}
```