Source file src/runtime/testdata/testprog/checkptr.go

     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("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  // CheckPtrAlignmentNilPtr tests that checkptrAlignment doesn't crash
    42  // on nil pointers (#47430).
    43  func CheckPtrAlignmentNilPtr() {
    44  	var do func(int)
    45  	do = func(n int) {
    46  		// Inflate the stack so runtime.shrinkstack gets called during GC
    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