mirror of
https://github.com/golang/go
synced 2024-11-19 09:04:41 -07:00
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
|
||
|
}
|