defererr

package module
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 10, 2024 License: GPL-3.0 Imports: 4 Imported by: 0

README

godefererr

GoDoc

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.

Example

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'

Install

$ go install gopkg.teddywing.com/defererr/cmd/godefererr@latest

License

Copyright © 2023 Teddy Wing. Licensed under the GNU GPLv3+ (see the included COPYING file).

Documentation

Overview

Package defererr defines an Analyzer that checks whether an error set in a defer closure is correctly returned.

Analyzer defererr

defererr: report incorrectly returned errors from defer closures.

Errors can be returned from a defer closure by setting a captured error variable within the closure. In order for this to work, the error variable must be declared in the function signature, and must be returned somewhere in the function. This analyzer checks to make sure that captured error variables assigned in defer closures are correctly declared and returned.

For example:

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'
}

Index

Constants

This section is empty.

Variables

View Source
var Analyzer = &analysis.Analyzer{
	Name: "defererr",
	Doc:  "reports issues returning errors from defer",
	Run:  run,
}

Functions

This section is empty.

Types

This section is empty.

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL