Also:
- add cmd/vet-lite, a version of cmd/vet that doesn't depend on
go/packages and must be run under "go vet". This will be vendored
into $GOROOT/src/cmd/vet.
- add an integration test for a unitchecker-based command under "go vet".
Change-Id: Id613dac2812816c6d6372fa6d1536c8d4e4c2676
Reviewed-on: https://go-review.googlesource.com/c/143418
Reviewed-by: Ian Cottrell <iancottrell@google.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
...and other trivial cleanups.
Multi-line doc comments have been moved to exported Doc constants for
the sake of godoc.
Change-Id: Ib1cbec5806c699d51283c34685c4cd96953f5384
Reviewed-on: https://go-review.googlesource.com/c/142360
Reviewed-by: Michael Matloob <matloob@golang.org>
The ctrlflow Analyzer builds a control-flow graph (see
golang.org/x/tools/go/cfg) for each named and unnamed function in the
package.
It computes for each function whether it can never return, either
because the function is an intrinsic that stops the thread (e.g.
os.Exit), or because control never reaches a return statement, or
because the function inevitably calls another function that never
returns. For each such function it exports a noReturn fact.
This change also:
- adds 'inspect', another Analyzer that builds an optimized AST
traversal table for use by nearly every other Analyzer.
- changes analysistest.Run to return the analysis result to enable
further testing.
(This required changing it to analyze one package at a time,
which is no less efficient, and is the typical case.)
Change-Id: I877e2b2363a365a9976aa9c2719ad3fba4df2634
Reviewed-on: https://go-review.googlesource.com/c/139478
Reviewed-by: Michael Matloob <matloob@golang.org>
internal/checker
- don't display "[name.category]" in diagnostic
output. Most users don't care which analyzer reported the message.
The -json output retains this information.
- print better log messages for analyze -debug=f.
- print (non-JSON) text output to standard error, like a compiler would.
passes/pkgfact
- fix a nil deref panic when encountering non-renaming imports.
- require names to have underscores before and after (_x_)
as this avoids a huge number of spurious matches in (e.g.) the
syscall package.
- don't export empty facts.
Change-Id: I86c003b96521334e371f9d5fcea1323cd779d7f0
Reviewed-on: https://go-review.googlesource.com/c/139657
Reviewed-by: Michael Matloob <matloob@golang.org>
Run-TryBot: Michael Matloob <matloob@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
CL 139320 unset these env vars for the whole process in two tests,
but the correct fix is to unset them for subprocesses forked by go/packages.
Change-Id: I35e3ab9e424b00326e9e813e4daf0ae92ec36e26
Reviewed-on: https://go-review.googlesource.com/c/139477
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This change adds support for testing the facts produced by an Analyzer
using a similar mechanism to the way it checks for diagnostics.
A "// want ..." comment may now contain a mixture of expectations for
diagnostics and facts. Diagnostics are indicated by a string literal,
as before. Facts are indicated by name:"regexp" where name identifies
the object (declared on the same line) with which the fact is
associated.
func neverReturns() { // want neverReturns:"noReturn"
for {}
}
Also:
- analysistest: report errors during package loading.
(We don't yet have a way to test RunDespiteErrors Analyzers in the
face of errors.)
- tests for Facts produced by findcall and pkgfacts.
(Findcall now produces facts just for testing.)
- Add String method to various Fact types.
Should the Fact interface have this method?
Change-Id: Ifa15fbd49d6ec3042b5fe9d3ebf22f4bdfdc8769
Reviewed-on: https://go-review.googlesource.com/139157
Reviewed-by: Michael Matloob <matloob@golang.org>
Some users may set GO111MODULE=on, and we will eventually want to be able to
build x/tools itself in module mode.
Updates golang/go#27858
Updates golang/go#27852
Change-Id: Iaf488b2a89e6526471530245cb580f1f0391a770
Reviewed-on: https://go-review.googlesource.com/137815
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
Forcing clients to register their Fact types with gob made for an
unfriendly API. Now the driver is again responsible for doing it.
The FactTypes field is now a slice of Fact values (not reflect.Types)
used only for their dynamic type, which is slightly more convenient.
Change-Id: I01219edb24bd2371ba642bb56508aa80c19a9b61
Reviewed-on: https://go-review.googlesource.com/137836
Run-TryBot: Alan Donovan <adonovan@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
Package checker is a driver for the analysis API.
It is an internal package, but is exposed by three different APIs:
analysistest, singlechecker, and multichecker.
Checker uses go/packages to load the specified packages (plus their
dependencies, if any analysis uses facts) from source code.
It constructs a graph of actions (analysis passes), whose dependency
edges may be "horizontal", when one analyzer depends on the output of
another applied to the same package, or "vertical", when an an
analyzer consumes facts produced by the same analyzer applied to a
dependency package.
The graph is executed in parallel, unless -debug=p.
Facts are passed from one pass to another in memory.
If -debug=s, facts are serialized, to exercise that logic.
Findings are printed at the end.
The -json flag selects JSON output.
Use -debug=t to print timing information.
Always use -debug=tp, for sequential mode, when timing.
Also:
- analysistest: a wrapper for testing checkers
- multichecker: a wrapper for writing multi-checker tools
Analysis flags are prefixed by name: -findcall.name=foo.
- cmd/analyze: a command-line tool based on multichecker
- singlechecker: a wrapper for writing single-checker tools
Analysis flags are unprefixed: -name=foo.
- passes/findcall/cmd/findcall: a standalone tool for the findcall analysis
- tests for findcall
- tests for pkgfact
Change-Id: Icfd4a49cee17e7de1ddb6ec15a62dc667fb2db04
Reviewed-on: https://go-review.googlesource.com/135679
Reviewed-by: Ian Cottrell <iancottrell@google.com>
Analysis -> Analyzer
Unit -> Pass
Output -> Result
Inputs -> ResultOf
Lemma -> Fact
Set{Object,Package}Lemma -> Export{Object,Package}Fact
{Object,Package}Lemma -> Import{Object,Package}Fact
LemmaTypes -> UsesFacts bool
plugins/ -> passes/
Notes:
- Unit.Output is no longer a field; it's the result of calling Analyzer.Run.
- Because analyzers no longer declare their LemmaTypes, they, not the
driver, are now responsible for registering Fact types with Gob.
A follow-up change will additionally rename:
Finding -> Report
Pass.Syntax -> Pass.Files
Pass.Info -> Pass.TypesInfo
Change-Id: Iccbdadbea5a0aafe732e23a344dd57fd93681931
Reviewed-on: https://go-review.googlesource.com/137095
Reviewed-by: Ian Cottrell <iancottrell@google.com>