blob: 0beaabb7439755853d0f4d247e423b3b40bf11a1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
// run
// Copyright 2020 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.
//go:build cgo
package main
import (
"runtime/cgo"
"unsafe"
)
type S struct {
_ cgo.Incomplete
x int
}
func main() {
var i int
p := (*S)(unsafe.Pointer(uintptr(unsafe.Pointer(&i))))
v := uintptr(unsafe.Pointer(p))
// p is a pointer to a not-in-heap type. Like some C libraries,
// we stored an integer in that pointer. That integer just happens
// to be the address of i.
// v is also the address of i.
// p has a base type which is marked not-in-heap, so it
// should not be adjusted when the stack is copied.
recurse(100, p, v)
}
func recurse(n int, p *S, v uintptr) {
if n > 0 {
recurse(n-1, p, v)
}
if uintptr(unsafe.Pointer(p)) != v {
panic("adjusted notinheap pointer")
}
}
|