From bef0055a0ae8c79c9a008b17356521afda1bce85 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Tue, 13 Jun 2017 16:22:06 +0100 Subject: [PATCH] cmd/vet: check that C receivers are cgo imports MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/cmd/vet/cgo.go | 7 ++++++- src/cmd/vet/testdata/cgo/cgo2.go | 3 +++ src/cmd/vet/testdata/cgo/cgo4.go | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/cmd/vet/testdata/cgo/cgo4.go 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}) -- 2.48.1