mirror of
https://github.com/golang/go
synced 2024-11-05 23:26:18 -07:00
350 lines
9.1 KiB
Markdown
350 lines
9.1 KiB
Markdown
|
# Analyzers
|
||
|
|
||
|
<!--TODO: Generate this file from the documentation in golang/org/x/tools/go/analysis/passes and golang/org/x/tools/go/lsp/source/options.go.-->
|
||
|
|
||
|
This document describes the analyzers that `gopls` uses inside the editor.
|
||
|
|
||
|
A value of `true` means that the analyzer is enabled by default and a value of `false` means it is disabled by default.
|
||
|
|
||
|
Details about how to enable/disable these analyses can be found [here](settings.md#analyses).
|
||
|
|
||
|
## Go vet suite
|
||
|
|
||
|
Below is the list of general analyzers that are used in `go vet`.
|
||
|
|
||
|
### **asmdecl**
|
||
|
|
||
|
report mismatches between assembly files and Go declarations
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **assign**
|
||
|
|
||
|
check for useless assignments
|
||
|
|
||
|
This checker reports assignments of the form `x = x` or `a[i] = a[i]`.
|
||
|
These are almost always useless, and even when they aren't they are
|
||
|
usually a mistake.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **atomic**
|
||
|
|
||
|
check for common mistakes using the sync/atomic package
|
||
|
|
||
|
The atomic checker looks for assignment statements of the form:
|
||
|
|
||
|
`x = atomic.AddUint64(&x, 1)`
|
||
|
|
||
|
which are not atomic.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **atomicalign**
|
||
|
|
||
|
check for non-64-bits-aligned arguments to sync/atomic functions
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **bools**
|
||
|
|
||
|
check for common mistakes involving boolean operators
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **buildtag**
|
||
|
|
||
|
check that +build tags are well-formed and correctly located
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **cgocall**
|
||
|
|
||
|
detect some violations of the cgo pointer passing rules
|
||
|
|
||
|
Check for invalid cgo pointer passing.
|
||
|
This looks for code that uses cgo to call C code passing values
|
||
|
whose types are almost always invalid according to the cgo pointer
|
||
|
sharing rules.
|
||
|
Specifically, it warns about attempts to pass a Go chan, map, func,
|
||
|
or slice to C, either directly, or via a pointer, array, or struct.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **composite**
|
||
|
|
||
|
check for unkeyed composite literals
|
||
|
|
||
|
This analyzer reports a diagnostic for composite literals of struct
|
||
|
types imported from another package that do not use the field-keyed
|
||
|
syntax. Such literals are fragile because the addition of a new field
|
||
|
(even if unexported) to the struct will cause compilation to fail.
|
||
|
|
||
|
As an example,
|
||
|
`err = &net.DNSConfigError{err}`
|
||
|
|
||
|
should be replaced by:
|
||
|
`err = &net.DNSConfigError{Err: err}`
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **copylock**
|
||
|
|
||
|
check for locks erroneously passed by value
|
||
|
|
||
|
Inadvertently copying a value containing a lock, such as sync.Mutex or
|
||
|
sync.WaitGroup, may cause both copies to malfunction. Generally such
|
||
|
values should be referred to through a pointer.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **errorsas**
|
||
|
|
||
|
report passing non-pointer or non-error values to errors.As
|
||
|
|
||
|
The errorsas analysis reports calls to errors.As where the type
|
||
|
of the second argument is not a pointer to a type implementing error.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **httpresponse**
|
||
|
|
||
|
check for mistakes using HTTP responses
|
||
|
|
||
|
A common mistake when using the net/http package is to defer a function
|
||
|
call to close the http.Response Body before checking the error that
|
||
|
determines whether the response is valid:
|
||
|
|
||
|
```go
|
||
|
resp, err := http.Head(url)
|
||
|
defer resp.Body.Close()
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
// (defer statement belongs here)
|
||
|
```
|
||
|
|
||
|
This checker helps uncover latent nil dereference bugs by reporting a
|
||
|
diagnostic for such mistakes.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **loopclosure**
|
||
|
|
||
|
check references to loop variables from within nested functions
|
||
|
|
||
|
This analyzer checks for references to loop variables from within a
|
||
|
function literal inside the loop body. It checks only instances where
|
||
|
the function literal is called in a defer or go statement that is the
|
||
|
last statement in the loop body, as otherwise we would need whole
|
||
|
program analysis.
|
||
|
|
||
|
For example:
|
||
|
```go
|
||
|
for i, v := range s {
|
||
|
go func() {
|
||
|
println(i, v) // not what you might expect
|
||
|
}()
|
||
|
}
|
||
|
```
|
||
|
|
||
|
See: https://golang.org/doc/go_faq.html#closures_and_goroutines
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **lostcancel**
|
||
|
|
||
|
check cancel func returned by context.WithCancel is called
|
||
|
|
||
|
The cancellation function returned by context.WithCancel, WithTimeout,
|
||
|
and WithDeadline must be called or the new context will remain live
|
||
|
until its parent context is cancelled.
|
||
|
(The background context is never cancelled.)
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **nilfunc**
|
||
|
|
||
|
check for useless comparisons between functions and nil
|
||
|
|
||
|
A useless comparison is one like f == nil as opposed to f() == nil.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **printf**
|
||
|
|
||
|
check consistency of Printf format strings and arguments
|
||
|
|
||
|
The check applies to known functions (for example, those in package fmt)
|
||
|
as well as any detected wrappers of known functions.
|
||
|
|
||
|
A function that wants to avail itself of printf checking but is not
|
||
|
found by this analyzer's heuristics (for example, due to use of
|
||
|
dynamic calls) can insert a bogus call:
|
||
|
|
||
|
```go
|
||
|
if false {
|
||
|
_ = fmt.Sprintf(format, args...) // enable printf checking
|
||
|
}
|
||
|
```
|
||
|
|
||
|
The -funcs flag specifies a comma-separated list of names of additional
|
||
|
known formatting functions or methods. If the name contains a period,
|
||
|
it must denote a specific function using one of the following forms:
|
||
|
|
||
|
```
|
||
|
dir/pkg.Function
|
||
|
dir/pkg.Type.Method
|
||
|
(*dir/pkg.Type).Method
|
||
|
```
|
||
|
|
||
|
Otherwise the name is interpreted as a case-insensitive unqualified
|
||
|
identifier such as "errorf". Either way, if a listed name ends in f, the
|
||
|
function is assumed to be Printf-like, taking a format string before the
|
||
|
argument list. Otherwise it is assumed to be Print-like, taking a list
|
||
|
of arguments with no format string.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **shift**
|
||
|
|
||
|
check for shifts that equal or exceed the width of the integer
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **stdmethods**
|
||
|
|
||
|
check signature of methods of well-known interfaces
|
||
|
|
||
|
Sometimes a type may be intended to satisfy an interface but may fail to
|
||
|
do so because of a mistake in its method signature.
|
||
|
For example, the result of this WriteTo method should be (int64, error),
|
||
|
not error, to satisfy io.WriterTo:
|
||
|
|
||
|
```go
|
||
|
type myWriterTo struct{...}
|
||
|
func (myWriterTo) WriteTo(w io.Writer) error { ... }
|
||
|
```
|
||
|
|
||
|
This check ensures that each method whose name matches one of several
|
||
|
well-known interface methods from the standard library has the correct
|
||
|
signature for that interface.
|
||
|
|
||
|
Checked method names include:
|
||
|
Format GobEncode GobDecode MarshalJSON MarshalXML
|
||
|
Peek ReadByte ReadFrom ReadRune Scan Seek
|
||
|
UnmarshalJSON UnreadByte UnreadRune WriteByte
|
||
|
WriteTo
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **structtag**
|
||
|
|
||
|
check that struct field tags conform to reflect.StructTag.Get
|
||
|
|
||
|
Also report certain struct tags (json, xml) used with unexported fields.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **tests**
|
||
|
|
||
|
check for common mistaken usages of tests and examples
|
||
|
|
||
|
The tests checker walks Test, Benchmark and Example functions checking
|
||
|
malformed names, wrong signatures and examples documenting non-existent
|
||
|
identifiers.
|
||
|
|
||
|
Please see the documentation for package testing in golang.org/pkg/testing
|
||
|
for the conventions that are enforced for Tests, Benchmarks, and Examples.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **unmarshal**
|
||
|
|
||
|
report passing non-pointer or non-interface values to unmarshal
|
||
|
|
||
|
The unmarshal analysis reports calls to functions such as json.Unmarshal
|
||
|
in which the argument type is not a pointer or an interface.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **unreachable**
|
||
|
|
||
|
check for unreachable code
|
||
|
|
||
|
The unreachable analyzer finds statements that execution can never reach
|
||
|
because they are preceded by an return statement, a call to panic, an
|
||
|
infinite loop, or similar constructs.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **unsafeptr**
|
||
|
|
||
|
check for invalid conversions of uintptr to unsafe.Pointer
|
||
|
|
||
|
The unsafeptr analyzer reports likely incorrect uses of unsafe.Pointer
|
||
|
to convert integers to pointers. A conversion from uintptr to
|
||
|
unsafe.Pointer is invalid if it implies that there is a uintptr-typed
|
||
|
word in memory that holds a pointer value, because that word will be
|
||
|
invisible to stack copying and to the garbage collector.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **unusedresult**
|
||
|
|
||
|
check for unused results of calls to some functions
|
||
|
|
||
|
Some functions like fmt.Errorf return a result and have no side effects,
|
||
|
so it is always a mistake to discard the result. This analyzer reports
|
||
|
calls to certain functions in which the result of the call is ignored.
|
||
|
|
||
|
The set of functions may be controlled using flags.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
## gopls suite
|
||
|
|
||
|
Below is the list of analyzers that are used by `gopls`.
|
||
|
|
||
|
### **deepequalerrors**
|
||
|
|
||
|
check for calls of reflect.DeepEqual on error values
|
||
|
|
||
|
The deepequalerrors checker looks for calls of the form:
|
||
|
|
||
|
```go
|
||
|
reflect.DeepEqual(err1, err2)
|
||
|
```
|
||
|
|
||
|
where err1 and err2 are errors. Using reflect.DeepEqual to compare
|
||
|
errors is discouraged.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **sortslice**
|
||
|
|
||
|
check the argument type of sort.Slice
|
||
|
|
||
|
sort.Slice requires an argument of a slice type. Check that
|
||
|
the interface{} value passed to sort.Slice is actually a slice.
|
||
|
|
||
|
Default value: `true`.
|
||
|
|
||
|
### **testinggoroutine**
|
||
|
|
||
|
report calls to (*testing.T).Fatal from goroutines started by a test.
|
||
|
|
||
|
Functions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and
|
||
|
Skip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.
|
||
|
This checker detects calls to these functions that occur within a goroutine
|
||
|
started by the test. For example:
|
||
|
|
||
|
```go
|
||
|
func TestFoo(t *testing.T) {
|
||
|
go func() {
|
||
|
t.Fatal("oops") // error: (*T).Fatal called from non-test goroutine
|
||
|
}()
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Default value: `true`.
|