Source file test/unsafebuiltins.go

     1  // run
     2  
     3  // Copyright 2021 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  package main
     8  
     9  import (
    10  	"math"
    11  	"unsafe"
    12  )
    13  
    14  const maxUintptr = 1 << (8 * unsafe.Sizeof(uintptr(0)))
    15  
    16  func main() {
    17  	var p [10]byte
    18  
    19  	// unsafe.Add
    20  	{
    21  		p1 := unsafe.Pointer(&p[1])
    22  		assert(unsafe.Add(p1, 1) == unsafe.Pointer(&p[2]))
    23  		assert(unsafe.Add(p1, -1) == unsafe.Pointer(&p[0]))
    24  	}
    25  
    26  	// unsafe.Slice
    27  	{
    28  		s := unsafe.Slice(&p[0], len(p))
    29  		assert(&s[0] == &p[0])
    30  		assert(len(s) == len(p))
    31  		assert(cap(s) == len(p))
    32  
    33  		// nil pointer with zero length returns nil
    34  		assert(unsafe.Slice((*int)(nil), 0) == nil)
    35  
    36  		// nil pointer with positive length panics
    37  		mustPanic(func() { _ = unsafe.Slice((*int)(nil), 1) })
    38  
    39  		// negative length
    40  		var neg int = -1
    41  		mustPanic(func() { _ = unsafe.Slice(new(byte), neg) })
    42  
    43  		// length too large
    44  		var tooBig uint64 = math.MaxUint64
    45  		mustPanic(func() { _ = unsafe.Slice(new(byte), tooBig) })
    46  
    47  		// size overflows address space
    48  		mustPanic(func() { _ = unsafe.Slice(new(uint64), maxUintptr/8) })
    49  		mustPanic(func() { _ = unsafe.Slice(new(uint64), maxUintptr/8+1) })
    50  	}
    51  }
    52  
    53  func assert(ok bool) {
    54  	if !ok {
    55  		panic("FAIL")
    56  	}
    57  }
    58  
    59  func mustPanic(f func()) {
    60  	defer func() {
    61  		assert(recover() != nil)
    62  	}()
    63  	f()
    64  }
    65  

View as plain text