Black Lives Matter. Support the Equal Justice Initiative.

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

Documentation: runtime/testdata/testprog

     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  }
    99  

View as plain text