mirror of
https://github.com/golang/go
synced 2024-11-06 03:26:15 -07:00
b752e9ffdf
LGTM=r R=r CC=golang-codereviews https://golang.org/cl/100470044
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
// Copyright 2014 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package testdata
|
|
|
|
import (
|
|
"reflect"
|
|
"unsafe"
|
|
)
|
|
|
|
func f() {
|
|
var x unsafe.Pointer
|
|
var y uintptr
|
|
x = unsafe.Pointer(y) // ERROR "possible misuse of unsafe.Pointer"
|
|
y = uintptr(x)
|
|
|
|
// only allowed pointer arithmetic is ptr +/- num.
|
|
// num+ptr is technically okay but still flagged: write ptr+num instead.
|
|
x = unsafe.Pointer(uintptr(x) + 1)
|
|
x = unsafe.Pointer(1 + uintptr(x)) // ERROR "possible misuse of unsafe.Pointer"
|
|
x = unsafe.Pointer(uintptr(x) + uintptr(x)) // ERROR "possible misuse of unsafe.Pointer"
|
|
x = unsafe.Pointer(uintptr(x) - 1)
|
|
x = unsafe.Pointer(1 - uintptr(x)) // ERROR "possible misuse of unsafe.Pointer"
|
|
|
|
// certain uses of reflect are okay
|
|
var v reflect.Value
|
|
x = unsafe.Pointer(v.Pointer())
|
|
x = unsafe.Pointer(v.UnsafeAddr())
|
|
var s1 *reflect.StringHeader
|
|
x = unsafe.Pointer(s1.Data)
|
|
var s2 *reflect.SliceHeader
|
|
x = unsafe.Pointer(s2.Data)
|
|
var s3 reflect.StringHeader
|
|
x = unsafe.Pointer(s3.Data) // ERROR "possible misuse of unsafe.Pointer"
|
|
var s4 reflect.SliceHeader
|
|
x = unsafe.Pointer(s4.Data) // ERROR "possible misuse of unsafe.Pointer"
|
|
|
|
// but only in reflect
|
|
var vv V
|
|
x = unsafe.Pointer(vv.Pointer()) // ERROR "possible misuse of unsafe.Pointer"
|
|
x = unsafe.Pointer(vv.UnsafeAddr()) // ERROR "possible misuse of unsafe.Pointer"
|
|
var ss1 *StringHeader
|
|
x = unsafe.Pointer(ss1.Data) // ERROR "possible misuse of unsafe.Pointer"
|
|
var ss2 *SliceHeader
|
|
x = unsafe.Pointer(ss2.Data) // ERROR "possible misuse of unsafe.Pointer"
|
|
|
|
}
|
|
|
|
type V interface {
|
|
Pointer() uintptr
|
|
UnsafeAddr() uintptr
|
|
}
|
|
|
|
type StringHeader struct {
|
|
Data uintptr
|
|
}
|
|
|
|
type SliceHeader struct {
|
|
Data uintptr
|
|
}
|