From: Aliaksandr Valialkin Date: Wed, 22 Jun 2016 17:16:41 +0000 (+0300) Subject: cmd/vet: check for copying of array of locks X-Git-Tag: go1.8beta1~1587 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bd9aa9811d63c121a84ef92bc9b6a4101af46235;p=gostls13.git cmd/vet: check for copying of array of locks Updates #14664 Change-Id: I1f7b1116cfe91466816c760f136ce566da3e80a9 Reviewed-on: https://go-review.googlesource.com/24340 Run-TryBot: Rob Pike TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- diff --git a/src/cmd/vet/copylock.go b/src/cmd/vet/copylock.go index 65337688bc..31c1257a47 100644 --- a/src/cmd/vet/copylock.go +++ b/src/cmd/vet/copylock.go @@ -210,6 +210,14 @@ func lockPath(tpkg *types.Package, typ types.Type) typePath { return nil } + for { + atyp, ok := typ.Underlying().(*types.Array) + if !ok { + break + } + typ = atyp.Elem() + } + // We're only interested in the case in which the underlying // type is a struct. (Interfaces and pointers are safe to copy.) styp, ok := typ.Underlying().(*types.Struct) diff --git a/src/cmd/vet/testdata/copylock.go b/src/cmd/vet/testdata/copylock.go index d49f468627..35ed766f1d 100644 --- a/src/cmd/vet/testdata/copylock.go +++ b/src/cmd/vet/testdata/copylock.go @@ -68,6 +68,24 @@ func BadFunc() { // override 'new' keyword new := func(interface{}) {} new(t) // ERROR "function call copies lock value: testdata.Tlock contains sync.Once contains sync.Mutex" + + // copy of array of locks + var muA [5]sync.Mutex + muB := muA // ERROR "assignment copies lock value to muB: sync.Mutex" + muA = muB // ERROR "assignment copies lock value to muA: sync.Mutex" + muSlice := muA[:] // OK + + // multidimensional array + var mmuA [5][5]sync.Mutex + mmuB := mmuA // ERROR "assignment copies lock value to mmuB: sync.Mutex" + mmuA = mmuB // ERROR "assignment copies lock value to mmuA: sync.Mutex" + mmuSlice := mmuA[:] // OK + + // slice copy is ok + var fmuA [5][][5]sync.Mutex + fmuB := fmuA // OK + fmuA = fmuB // OK + fmuSlice := fmuA[:] // OK } // SyncTypesCheck checks copying of sync.* types except sync.Mutex