1
2
3
4
5 package main
6
7 import (
8 "runtime"
9 "time"
10 "unsafe"
11 )
12
13 func init() {
14 register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr)
15 register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr)
16 register("CheckPtrAlignmentNilPtr", CheckPtrAlignmentNilPtr)
17 register("CheckPtrArithmetic", CheckPtrArithmetic)
18 register("CheckPtrArithmetic2", CheckPtrArithmetic2)
19 register("CheckPtrSize", CheckPtrSize)
20 register("CheckPtrSmall", CheckPtrSmall)
21 register("CheckPtrSliceOK", CheckPtrSliceOK)
22 register("CheckPtrSliceFail", CheckPtrSliceFail)
23 }
24
25 func CheckPtrAlignmentNoPtr() {
26 var x [2]int64
27 p := unsafe.Pointer(&x[0])
28 sink2 = (*int64)(unsafe.Pointer(uintptr(p) + 1))
29 }
30
31 func CheckPtrAlignmentPtr() {
32 var x [2]int64
33 p := unsafe.Pointer(&x[0])
34 sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
35 }
36
37
38
39 func CheckPtrAlignmentNilPtr() {
40 var do func(int)
41 do = func(n int) {
42
43 if n > 0 {
44 do(n - 1)
45 }
46
47 var p unsafe.Pointer
48 _ = (*int)(p)
49 }
50
51 go func() {
52 for {
53 runtime.GC()
54 }
55 }()
56
57 go func() {
58 for i := 0; ; i++ {
59 do(i % 1024)
60 }
61 }()
62
63 time.Sleep(time.Second)
64 }
65
66 func CheckPtrArithmetic() {
67 var x int
68 i := uintptr(unsafe.Pointer(&x))
69 sink2 = (*int)(unsafe.Pointer(i))
70 }
71
72 func CheckPtrArithmetic2() {
73 var x [2]int64
74 p := unsafe.Pointer(&x[1])
75 var one uintptr = 1
76 sink2 = unsafe.Pointer(uintptr(p) & ^one)
77 }
78
79 func CheckPtrSize() {
80 p := new(int64)
81 sink2 = p
82 sink2 = (*[100]int64)(unsafe.Pointer(p))
83 }
84
85 func CheckPtrSmall() {
86 sink2 = unsafe.Pointer(uintptr(1))
87 }
88
89 func CheckPtrSliceOK() {
90 p := new([4]int64)
91 sink2 = unsafe.Slice(&p[1], 3)
92 }
93
94 func CheckPtrSliceFail() {
95 p := new(int64)
96 sink2 = p
97 sink2 = unsafe.Slice(p, 100)
98 }
99
View as plain text