From: Daniel Martí Date: Tue, 13 Jun 2017 15:22:06 +0000 (+0100) Subject: cmd/vet: check that C receivers are cgo imports X-Git-Tag: go1.10beta1~1693 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=bef0055a0ae8c79c9a008b17356521afda1bce85;p=gostls13.git cmd/vet: check that C receivers are cgo imports Otherwise, vet might have false positives when "C" is a variable and we're just using a method on it. Or when an import was renamed to "C". Add test files for both of these cases. Fixes #20655. Change-Id: I55fb93119444a67fcf7891ad92653678cbd4670e Reviewed-on: https://go-review.googlesource.com/45551 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder Reviewed-by: Rob Pike --- diff --git a/src/cmd/vet/cgo.go b/src/cmd/vet/cgo.go index 984911c489..76364ff6ed 100644 --- a/src/cmd/vet/cgo.go +++ b/src/cmd/vet/cgo.go @@ -34,7 +34,12 @@ func checkCgoCall(f *File, node ast.Node) { return } id, ok := sel.X.(*ast.Ident) - if !ok || id.Name != "C" { + if !ok { + return + } + + pkgname, ok := f.pkg.uses[id].(*types.PkgName) + if !ok || pkgname.Imported().Path() != "C" { return } diff --git a/src/cmd/vet/testdata/cgo/cgo2.go b/src/cmd/vet/testdata/cgo/cgo2.go index 276aea9619..4f27116893 100644 --- a/src/cmd/vet/testdata/cgo/cgo2.go +++ b/src/cmd/vet/testdata/cgo/cgo2.go @@ -7,3 +7,6 @@ package testdata var _ = C.f(*p(**p)) + +// Passing a pointer (via the slice), but C isn't cgo. +var _ = C.f([]int{3}) diff --git a/src/cmd/vet/testdata/cgo/cgo4.go b/src/cmd/vet/testdata/cgo/cgo4.go new file mode 100644 index 0000000000..67b54506ab --- /dev/null +++ b/src/cmd/vet/testdata/cgo/cgo4.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test the cgo checker on a file that doesn't use cgo, but has an +// import named "C". + +package testdata + +import C "fmt" + +var _ = C.Println(*p(**p)) + +// Passing a pointer (via a slice), but C is fmt, not cgo. +var _ = C.Println([]int{3})