go/misc/cgo
Gernot Vormayr 84fce9832b cmd/cgo: fix check for conversion of ptr to struct field
According to the documentation "When passing a pointer to a field in a
struct, the Go memory in question is the memory occupied by the field,
not the entire struct.". checkAddr states that this should also work
with type conversions, which is implemented in isType. However,
ast.StarExpr must be enclosed in ast.ParenExpr according to the go spec
(see example below), which is not considered in the checks.

Example:
    // struct Si { int i; int *p; }; void f(struct I *x) {}
    import "C"
    type S {
        p *int
        i C.struct_Si
    }
    func main() {
        v := &S{new(int)}
        C.f((*C.struct_I)(&v.i)) // <- panic
    }

This example will cause cgo to emit a cgoCheck that checks the whole
struct S instead of just S.i causing the panic "cgo argument has Go
pointer to Go pointer".

This patch fixes this situation by adding support for ast.ParenExpr to
isType and adds a test, that fails without the fix.

Fixes #32970.

Change-Id: I15ea28c98f839e9fa708859ed107a2e5f1483133
Reviewed-on: https://go-review.googlesource.com/c/go/+/185098
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
2019-07-09 19:21:43 +00:00
..
errors cmd/cgo: fix check for conversion of ptr to struct field 2019-07-09 19:21:43 +00:00
fortran cmd/compile, misc/cgo: fix fortran tests on aix/ppc64 2019-03-22 13:52:59 +00:00
gmp all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00
life misc/android: enable many more tests on GOOS=android 2019-03-08 23:32:03 +00:00
nocgo cmd/ld: really import runtime/cgo for external link 2014-05-20 21:36:50 -07:00
stdio misc/android: enable many more tests on GOOS=android 2019-03-08 23:32:03 +00:00
test misc/cgo/test: use char, not int, so test works on big-endian systems 2019-06-25 21:47:04 +00:00
testasan runtime: more flexible heap memory mapping on 64-bits 2013-06-12 18:47:16 +04:00
testcarchive misc/cgo: disable testcarchive, testplugin during -short test (including all.bash) 2019-05-16 03:25:04 +00:00
testcshared misc/cgo: disable testcarchive, testplugin during -short test (including all.bash) 2019-05-16 03:25:04 +00:00
testgodefs misc/cgo/testgodefs: move source files into testdata 2019-02-26 02:44:12 +00:00
testplugin misc/cgo: disable testcarchive, testplugin during -short test (including all.bash) 2019-05-16 03:25:04 +00:00
testsanitizers runtime: save/restore callee saved registers in arm64's sigtramp 2019-06-03 19:02:11 +00:00
testshared misc/cgo: gofmt testdata files 2019-03-22 07:21:24 +00:00
testsigfwd misc/cgo/testsigfwd: add missing return statement 2016-08-30 21:44:14 +00:00
testso misc/cgo: enable testso and testsovar on aix/ppc64 2019-03-27 17:21:28 +00:00
testsovar misc/cgo: enable testso and testsovar on aix/ppc64 2019-03-27 17:21:28 +00:00
testtls all: make copyright headers consistent with one space after period 2016-05-02 13:43:18 +00:00