github.com/go-darwin/sys@v0.0.0-20220510002607-68fd01f054ca/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  	register("CheckPtrAlignmentNested", CheckPtrAlignmentNested)
    24  }
    25  
    26  func CheckPtrAlignmentNoPtr() {
    27  	var x [2]int64
    28  	p := unsafe.Pointer(&x[0])
    29  	sink2 = (*int64)(unsafe.Pointer(uintptr(p) + 1))
    30  }
    31  
    32  func CheckPtrAlignmentPtr() {
    33  	var x [2]int64
    34  	p := unsafe.Pointer(&x[0])
    35  	sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1))
    36  }
    37  
    38  // CheckPtrAlignmentNilPtr tests that checkptrAlignment doesn't crash
    39  // on nil pointers (#47430).
    40  func CheckPtrAlignmentNilPtr() {
    41  	var do func(int)
    42  	do = func(n int) {
    43  		// Inflate the stack so runtime.shrinkstack gets called during GC
    44  		if n > 0 {
    45  			do(n - 1)
    46  		}
    47  
    48  		var p unsafe.Pointer
    49  		_ = (*int)(p)
    50  	}
    51  
    52  	go func() {
    53  		for {
    54  			runtime.GC()
    55  		}
    56  	}()
    57  
    58  	go func() {
    59  		for i := 0; ; i++ {
    60  			do(i % 1024)
    61  		}
    62  	}()
    63  
    64  	time.Sleep(time.Second)
    65  }
    66  
    67  func CheckPtrArithmetic() {
    68  	var x int
    69  	i := uintptr(unsafe.Pointer(&x))
    70  	sink2 = (*int)(unsafe.Pointer(i))
    71  }
    72  
    73  func CheckPtrArithmetic2() {
    74  	var x [2]int64
    75  	p := unsafe.Pointer(&x[1])
    76  	var one uintptr = 1
    77  	sink2 = unsafe.Pointer(uintptr(p) & ^one)
    78  }
    79  
    80  func CheckPtrSize() {
    81  	p := new(int64)
    82  	sink2 = p
    83  	sink2 = (*[100]int64)(unsafe.Pointer(p))
    84  }
    85  
    86  func CheckPtrSmall() {
    87  	sink2 = unsafe.Pointer(uintptr(1))
    88  }
    89  
    90  func CheckPtrSliceOK() {
    91  	p := new([4]int64)
    92  	sink2 = unsafe.Slice(&p[1], 3)
    93  }
    94  
    95  func CheckPtrSliceFail() {
    96  	p := new(int64)
    97  	sink2 = p
    98  	sink2 = unsafe.Slice(p, 100)
    99  }
   100  
   101  func CheckPtrAlignmentNested() {
   102  	s := make([]int8, 100)
   103  	p := unsafe.Pointer(&s[0])
   104  	n := 9
   105  	_ = ((*[10]int8)(unsafe.Pointer((*[10]int64)(unsafe.Pointer(&p)))))[:n:n]
   106  }