github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/go/src/runtime/testdata/testprog/checkptr.go (about) 1 // Copyright 2020 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 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 // CheckPtrAlignmentNilPtr tests that checkptrAlignment doesn't crash 38 // on nil pointers (#47430). 39 func CheckPtrAlignmentNilPtr() { 40 var do func(int) 41 do = func(n int) { 42 // Inflate the stack so runtime.shrinkstack gets called during GC 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 }