diff options
| author | Ian Lance Taylor <iant@golang.org> | 2016-10-14 14:53:59 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2016-10-19 21:20:50 +0000 |
| commit | a16954b8a7d66169760fb60dd7f3d4e400a5e98c (patch) | |
| tree | 3cf55b6ab53091088fbd49dd70645711cf78476e /misc/cgo/errors | |
| parent | e32ac7978df02fae0cbbd92bb65d0d50ea4d2df5 (diff) | |
| download | go-a16954b8a7d66169760fb60dd7f3d4e400a5e98c.tar.xz | |
cmd/cgo: always use a function literal for pointer checking
The pointer checking code needs to know the exact type of the parameter
expected by the C function, so that it can use a type assertion to
convert the empty interface returned by cgoCheckPointer to the correct
type. Previously this was done by using a type conversion, but that
meant that the code accepted arguments that were convertible to the
parameter type, rather than arguments that were assignable as in a
normal function call. In other words, some code that should not have
passed type checking was accepted.
This CL changes cgo to always use a function literal for pointer
checking. Now the argument is passed to the function literal, which has
the correct argument type, so type checking is performed just as for a
function call as it should be.
Since we now always use a function literal, simplify the checking code
to run as a statement by itself. It now no longer needs to return a
value, and we no longer need a type assertion.
This does have the cost of introducing another function call into any
call to a C function that requires pointer checking, but the cost of the
additional call should be minimal compared to the cost of pointer
checking.
Fixes #16591.
Change-Id: I220165564cf69db9fd5f746532d7f977a5b2c989
Reviewed-on: https://go-review.googlesource.com/31233
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'misc/cgo/errors')
| -rw-r--r-- | misc/cgo/errors/issue16591.go | 17 | ||||
| -rwxr-xr-x | misc/cgo/errors/test.bash | 1 |
2 files changed, 18 insertions, 0 deletions
diff --git a/misc/cgo/errors/issue16591.go b/misc/cgo/errors/issue16591.go new file mode 100644 index 0000000000..10eb8403cf --- /dev/null +++ b/misc/cgo/errors/issue16591.go @@ -0,0 +1,17 @@ +// Copyright 2016 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. + +// Issue 16591: Test that we detect an invalid call that was being +// hidden by a type conversion inserted by cgo checking. + +package p + +// void f(int** p) { } +import "C" + +type x *C.int + +func F(p *x) { + C.f(p) // ERROR HERE +} diff --git a/misc/cgo/errors/test.bash b/misc/cgo/errors/test.bash index 84d44d8a33..cb442507a6 100755 --- a/misc/cgo/errors/test.bash +++ b/misc/cgo/errors/test.bash @@ -46,6 +46,7 @@ check issue13423.go expect issue13635.go C.uchar C.schar C.ushort C.uint C.ulong C.longlong C.ulonglong C.complexfloat C.complexdouble check issue13830.go check issue16116.go +check issue16591.go if ! go build issue14669.go; then exit 1 |
