commit | 3288bc1ea189823249bad74d418f7247d4ac83b9 | [log] [tgz] |
---|---|---|
author | Keith Randall <khr@golang.org> | Sun Aug 16 12:41:42 2020 -0700 |
committer | Keith Randall <khr@golang.org> | Mon Nov 02 19:21:40 2020 +0000 |
tree | 6b97b93249aa0643a01c30437e0e8da85fcaa684 | |
parent | b53d4cbd60a6d7a92fac9b4a58de426c07a5666d [diff] |
go/analysis: add frame pointer check for vet Our calling convention requires BP to be preserved (it is callee-save). But that only happened with the introduction of framepointers in 1.5. Furthermore, nothing checks it, so there is assembly from before and since which violates the calling convention. The frame pointer is not used by Go, but only by kernel traceback code (for sampled profiling), so no one noticed. Also, the frame pointer tends to "fix itself", since after it is clobbered by an assembly function f, the calling function fixes the frame pointer up when that function returns. I've fixed the stdlib, CLs 248260, 248261, 248262. This CL is a simple check, intended to be used in vet, to catch assembly that violates the calling convention by overwriting the frame pointer without saving/restoring it. It is not intended to catch all violations, just ones that are easy to find. We look for a write to the frame pointer before any use of the frame pointer or any control flow instruction. In such a situation, there's no way the code could restore the value of BP before returning. This analysis is very conservative; it gives up in lots of cases. False positive should be very rare, though. Possible false positives: // looks like a write to BP, but isn't. CMPQ BP, BP // BP actually isn't clobbered, just swapped with AX. XORQ AX, BP XORQ BP, AX XORQ AX, BP The first is unlikely, as it is using the contents of an incoming register, which is junk. The second is a general problem of op= assembly operations that are indistiguishable in syntax from = operations. But anything other than the swap above also depends on the incoming junk value in BP. The swap itself is pointless (XCHQ works better). Change-Id: Ie9d91ab3396409486f7022380ad46ac76c3fbed4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/248686 Trust: Keith Randall <khr@golang.org> Trust: Emmanuel Odeke <emmanuel@orijtech.com> Run-TryBot: Keith Randall <khr@golang.org> gopls-CI: kokoro <noreply+kokoro@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Matloob <matloob@golang.org>
This subrepository holds the source for various packages and tools that support the Go programming language.
Some of the tools, godoc
and vet
for example, are included in binary Go distributions.
Others, including the Go guru
and the test coverage tool, can be fetched with go get
.
Packages include a type-checker for Go and an implementation of the Static Single Assignment form (SSA) representation for Go programs.
The easiest way to install is to run go get -u golang.org/x/tools/...
. You can also manually git clone the repository to $GOPATH/src/golang.org/x/tools
.
This repository uses prettier to format JS and CSS files.
The version of prettier
used is 1.18.2.
It is encouraged that all JS and CSS code be run through this before submitting a change. However, it is not a strict requirement enforced by CI.
This repository uses Gerrit for code changes. To learn how to submit changes to this repository, see https://golang.org/doc/contribute.html.
The main issue tracker for the tools repository is located at https://github.com/golang/go/issues. Prefix your issue with “x/tools/(your subdir):” in the subject line, so it is easy to find.