An analyser that reports incorrectly returned errors from defer closures.
Errors can be returned from a defer
closure by assigning the error to a
captured variable declared in the function signature. This analyser looks for
defer closures that assign captured error variables and checks that they are
correctly declared and returned.
Given the following program:
package main
import (
"errors"
"log"
)
func main() {
err := returnErrorFromDefer()
if err != nil {
log.Fatal(err)
}
log.Println("test")
}
func returnErrorFromDefer() error { // return signature should be '(err error)'
var err error = nil
if err != nil {
return err
}
defer func() {
err = errors.New("defer error")
}()
return nil // return should use 'err'
}
the analyser produces the following results:
$ godefererr ./...
package_doc_example.go:17:29: return signature should use named error parameter err
package_doc_example.go:27:9: does not return 'err'
$ go install gopkg.teddywing.com/defererr/cmd/godefererr@latest
Copyright © 2023 Teddy Wing. Licensed under the GNU GPLv3+ (see the included COPYING file).