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("CheckPtrArithmeticUnsafeAdd", CheckPtrArithmeticUnsafeAdd)
20 register("CheckPtrSize", CheckPtrSize)
21 register("CheckPtrSmall", CheckPtrSmall)
22 register("CheckPtrSliceOK", CheckPtrSliceOK)
23 register("CheckPtrSliceFail", CheckPtrSliceFail)
24 register("CheckPtrStringOK", CheckPtrStringOK)
25 register("CheckPtrStringFail", CheckPtrStringFail)
26 register("CheckPtrAlignmentNested", CheckPtrAlignmentNested)
27 }
28
29 func CheckPtrAlignmentNoPtr() {
30 var x [2]int64
31 p := unsafe.Pointer(&x[0])
32 sink2 = (*int64)(unsafe.Pointer(uintptr(p) + 1))
33 }
34
35 func CheckPtrAlignmentPtr() {
36 var x [2]int64
37 p := unsafe.Pointer(&x[0])
38 sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
39 }
40
41
42
43 func CheckPtrAlignmentNilPtr() {
44 var do func(int)
45 do = func(n int) {
46
47 if n > 0 {
48 do(n - 1)
49 }
50
51 var p unsafe.Pointer
52 _ = (*int)(p)
53 }
54
55 go func() {
56 for {
57 runtime.GC()
58 }
59 }()
60
61 go func() {
62 for i := 0; ; i++ {
63 do(i % 1024)
64 }
65 }()
66
67 time.Sleep(time.Second)
68 }
69
70 func CheckPtrArithmetic() {
71 var x int
72 i := uintptr(unsafe.Pointer(&x))
73 sink2 = (*int)(unsafe.Pointer(i))
74 }
75
76 func CheckPtrArithmetic2() {
77 var x [2]int64
78 p := unsafe.Pointer(&x[1])
79 var one uintptr = 1
80 sink2 = unsafe.Pointer(uintptr(p) & ^one)
81 }
82
83 func CheckPtrArithmeticUnsafeAdd() {
84 data := make([]byte, 128)
85 sink2 = (*byte)(unsafe.Add(unsafe.Pointer(unsafe.SliceData(data)), len(data)))
86 }
87
88 func CheckPtrSize() {
89 p := new(int64)
90 sink2 = p
91 sink2 = (*[100]int64)(unsafe.Pointer(p))
92 }
93
94 func CheckPtrSmall() {
95 sink2 = unsafe.Pointer(uintptr(1))
96 }
97
98 func CheckPtrSliceOK() {
99 p := new([4]int64)
100 sink2 = unsafe.Slice(&p[1], 3)
101 }
102
103 func CheckPtrSliceFail() {
104 p := new(int64)
105 sink2 = p
106 sink2 = unsafe.Slice(p, 100)
107 }
108
109 func CheckPtrStringOK() {
110 p := new([4]byte)
111 sink2 = unsafe.String(&p[1], 3)
112 }
113
114 func CheckPtrStringFail() {
115 p := new(byte)
116 sink2 = p
117 sink2 = unsafe.String(p, 100)
118 }
119
120 func CheckPtrAlignmentNested() {
121 s := make([]int8, 100)
122 p := unsafe.Pointer(&s[0])
123 n := 9
124 _ = ((*[10]int8)(unsafe.Pointer((*[10]int64)(unsafe.Pointer(&p)))))[:n:n]
125 }
126
View as plain text