Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

01 Июн 2026

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

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

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:

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

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

  ....
}

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

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:

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
  }

  ....
}