1
0
mirror of https://github.com/golang/go synced 2024-11-15 00:20:30 -07:00

runtime: support cgo index into pointer-to-array

We were missing a case for calling a C function with an index
into a pointer-to-array.

Fixes #70016

Change-Id: I9c74d629e58722813c1aaa0f0dc225a5a64d111b
Reviewed-on: https://go-review.googlesource.com/c/go/+/621576
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Ian Lance Taylor 2024-10-23 17:27:44 -07:00 committed by Gopher Robot
parent 4646556ba4
commit 76f3208367
2 changed files with 28 additions and 0 deletions

View File

@ -472,6 +472,23 @@ var ptrTests = []ptrTest{
body: `s := struct { a [4]byte; p *int }{p: new(int)}; C.f43(unsafe.Pointer(unsafe.SliceData(s.a[:])))`, body: `s := struct { a [4]byte; p *int }{p: new(int)}; C.f43(unsafe.Pointer(unsafe.SliceData(s.a[:])))`,
fail: false, fail: false,
}, },
{
// Passing the address of an element of a pointer-to-array.
name: "arraypointer",
c: `void f44(void* p) {}`,
imports: []string{"unsafe"},
body: `a := new([10]byte); C.f44(unsafe.Pointer(&a[0]))`,
fail: false,
},
{
// Passing the address of an element of a pointer-to-array
// that contains a Go pointer.
name: "arraypointer2",
c: `void f45(void** p) {}`,
imports: []string{"unsafe"},
body: `i := 0; a := &[2]unsafe.Pointer{nil, unsafe.Pointer(&i)}; C.f45(&a[0])`,
fail: true,
},
} }
func TestPointerChecks(t *testing.T) { func TestPointerChecks(t *testing.T) {

View File

@ -563,6 +563,17 @@ func cgoCheckPointer(ptr any, arg any) {
ep = aep ep = aep
t = ep._type t = ep._type
top = false top = false
case abi.Pointer:
// The Go code is indexing into a pointer to an array,
// and we have been passed the pointer-to-array.
// Check the array rather than the pointer.
pt := (*abi.PtrType)(unsafe.Pointer(aep._type))
t = pt.Elem
if t.Kind_&abi.KindMask != abi.Array {
throw("can't happen")
}
ep = aep
top = false
default: default:
throw("can't happen") throw("can't happen")
} }