V8023. It is possible that a wrong variable of the 'error' type is checked for 'nil'.
Анализатор обнаружил код, в котором на 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
}
....
}