aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAliaksandr Valialkin <valyala@gmail.com>2016-12-19 19:28:17 +0200
committerRob Pike <r@golang.org>2016-12-24 21:41:34 +0000
commitd160982a2ef9193384fb3c66939db0fb37a21ba3 (patch)
treeeac5231a1e0f7a216f2ad0b51913c3cac9f53ec9
parenta3f4cc06694c8b0bcf14ad36ebc10e66321e3d0f (diff)
downloadgo-d160982a2ef9193384fb3c66939db0fb37a21ba3.tar.gz
go-d160982a2ef9193384fb3c66939db0fb37a21ba3.zip
cmd/vet: fix copylocks false positive on len(array) and cap(array).
This is a follow-up for https://golang.org/cl/24340. Updates #14664. Fixes #18374. Change-Id: I2831556a9014d30ec70d5f91943d18c33db5b390 Reviewed-on: https://go-review.googlesource.com/34630 Reviewed-by: Rob Pike <r@golang.org> Run-TryBot: Rob Pike <r@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
-rw-r--r--src/cmd/vet/copylock.go8
-rw-r--r--src/cmd/vet/testdata/copylock.go14
2 files changed, 19 insertions, 3 deletions
diff --git a/src/cmd/vet/copylock.go b/src/cmd/vet/copylock.go
index 31c1257a47..f3ab8e2e05 100644
--- a/src/cmd/vet/copylock.go
+++ b/src/cmd/vet/copylock.go
@@ -93,9 +93,11 @@ func checkCopyLocksReturnStmt(f *File, rs *ast.ReturnStmt) {
// checkCopyLocksCallExpr detects lock copy in the arguments to a function call
func checkCopyLocksCallExpr(f *File, ce *ast.CallExpr) {
- if id, ok := ce.Fun.(*ast.Ident); ok && id.Name == "new" && f.pkg.types[id].IsBuiltin() {
- // Skip 'new(Type)' for built-in 'new'
- return
+ if id, ok := ce.Fun.(*ast.Ident); ok && f.pkg.types[id].IsBuiltin() {
+ switch id.Name {
+ case "new", "len", "cap":
+ return
+ }
}
for _, x := range ce.Args {
if path := lockPathRhs(f, x); path != nil {
diff --git a/src/cmd/vet/testdata/copylock.go b/src/cmd/vet/testdata/copylock.go
index 35ed766f1d..3ce06f88d4 100644
--- a/src/cmd/vet/testdata/copylock.go
+++ b/src/cmd/vet/testdata/copylock.go
@@ -88,6 +88,20 @@ func BadFunc() {
fmuSlice := fmuA[:] // OK
}
+func LenAndCapOnLockArrays() {
+ var a [5]sync.Mutex
+ aLen := len(a) // OK
+ aCap := cap(a) // OK
+
+ // override 'len' and 'cap' keywords
+
+ len := func(interface{}) {}
+ len(a) // ERROR "function call copies lock value: sync.Mutex"
+
+ cap := func(interface{}) {}
+ cap(a) // ERROR "function call copies lock value: sync.Mutex"
+}
+
// SyncTypesCheck checks copying of sync.* types except sync.Mutex
func SyncTypesCheck() {
// sync.RWMutex copying