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:
parent
4646556ba4
commit
76f3208367
@ -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) {
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user