github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/analysis/passes/unsafeptr/testdata/src/a/a.go (about) 1 // Copyright 2014 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 a 6 7 import ( 8 "reflect" 9 "unsafe" 10 ) 11 12 func f() { 13 var x unsafe.Pointer 14 var y uintptr 15 x = unsafe.Pointer(y) // want "possible misuse of unsafe.Pointer" 16 y = uintptr(x) 17 18 // only allowed pointer arithmetic is ptr +/-/&^ num. 19 // num+ptr is technically okay but still flagged: write ptr+num instead. 20 x = unsafe.Pointer(uintptr(x) + 1) 21 x = unsafe.Pointer(((uintptr((x))) + 1)) 22 x = unsafe.Pointer(1 + uintptr(x)) // want "possible misuse of unsafe.Pointer" 23 x = unsafe.Pointer(uintptr(x) + uintptr(x)) // want "possible misuse of unsafe.Pointer" 24 x = unsafe.Pointer(uintptr(x) - 1) 25 x = unsafe.Pointer(1 - uintptr(x)) // want "possible misuse of unsafe.Pointer" 26 x = unsafe.Pointer(uintptr(x) &^ 3) 27 x = unsafe.Pointer(1 &^ uintptr(x)) // want "possible misuse of unsafe.Pointer" 28 29 // certain uses of reflect are okay 30 var v reflect.Value 31 x = unsafe.Pointer(v.Pointer()) 32 x = unsafe.Pointer(v.Pointer() + 1) // want "possible misuse of unsafe.Pointer" 33 x = unsafe.Pointer(v.UnsafeAddr()) 34 x = unsafe.Pointer((v.UnsafeAddr())) 35 var s1 *reflect.StringHeader 36 x = unsafe.Pointer(s1.Data) 37 x = unsafe.Pointer(s1.Data + 1) // want "possible misuse of unsafe.Pointer" 38 var s2 *reflect.SliceHeader 39 x = unsafe.Pointer(s2.Data) 40 var s3 reflect.StringHeader 41 x = unsafe.Pointer(s3.Data) // want "possible misuse of unsafe.Pointer" 42 var s4 reflect.SliceHeader 43 x = unsafe.Pointer(s4.Data) // want "possible misuse of unsafe.Pointer" 44 45 // but only in reflect 46 var vv V 47 x = unsafe.Pointer(vv.Pointer()) // want "possible misuse of unsafe.Pointer" 48 x = unsafe.Pointer(vv.UnsafeAddr()) // want "possible misuse of unsafe.Pointer" 49 var ss1 *StringHeader 50 x = unsafe.Pointer(ss1.Data) // want "possible misuse of unsafe.Pointer" 51 var ss2 *SliceHeader 52 x = unsafe.Pointer(ss2.Data) // want "possible misuse of unsafe.Pointer" 53 54 } 55 56 type V interface { 57 Pointer() uintptr 58 UnsafeAddr() uintptr 59 } 60 61 type StringHeader struct { 62 Data uintptr 63 } 64 65 type SliceHeader struct { 66 Data uintptr 67 }