Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / go / analysis / passes / unsafeptr / testdata / src / a / a.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/analysis/passes/unsafeptr/testdata/src/a/a.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/go/analysis/passes/unsafeptr/testdata/src/a/a.go
new file mode 100644 (file)
index 0000000..361dfb9
--- /dev/null
@@ -0,0 +1,67 @@
+// 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 a
+
+import (
+       "reflect"
+       "unsafe"
+)
+
+func f() {
+       var x unsafe.Pointer
+       var y uintptr
+       x = unsafe.Pointer(y) // want "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(((uintptr((x))) + 1))
+       x = unsafe.Pointer(1 + uintptr(x))          // want "possible misuse of unsafe.Pointer"
+       x = unsafe.Pointer(uintptr(x) + uintptr(x)) // want "possible misuse of unsafe.Pointer"
+       x = unsafe.Pointer(uintptr(x) - 1)
+       x = unsafe.Pointer(1 - uintptr(x)) // want "possible misuse of unsafe.Pointer"
+       x = unsafe.Pointer(uintptr(x) &^ 3)
+       x = unsafe.Pointer(1 &^ uintptr(x)) // want "possible misuse of unsafe.Pointer"
+
+       // certain uses of reflect are okay
+       var v reflect.Value
+       x = unsafe.Pointer(v.Pointer())
+       x = unsafe.Pointer(v.Pointer() + 1) // want "possible misuse of unsafe.Pointer"
+       x = unsafe.Pointer(v.UnsafeAddr())
+       x = unsafe.Pointer((v.UnsafeAddr()))
+       var s1 *reflect.StringHeader
+       x = unsafe.Pointer(s1.Data)
+       x = unsafe.Pointer(s1.Data + 1) // want "possible misuse of unsafe.Pointer"
+       var s2 *reflect.SliceHeader
+       x = unsafe.Pointer(s2.Data)
+       var s3 reflect.StringHeader
+       x = unsafe.Pointer(s3.Data) // want "possible misuse of unsafe.Pointer"
+       var s4 reflect.SliceHeader
+       x = unsafe.Pointer(s4.Data) // want "possible misuse of unsafe.Pointer"
+
+       // but only in reflect
+       var vv V
+       x = unsafe.Pointer(vv.Pointer())    // want "possible misuse of unsafe.Pointer"
+       x = unsafe.Pointer(vv.UnsafeAddr()) // want "possible misuse of unsafe.Pointer"
+       var ss1 *StringHeader
+       x = unsafe.Pointer(ss1.Data) // want "possible misuse of unsafe.Pointer"
+       var ss2 *SliceHeader
+       x = unsafe.Pointer(ss2.Data) // want "possible misuse of unsafe.Pointer"
+
+}
+
+type V interface {
+       Pointer() uintptr
+       UnsafeAddr() uintptr
+}
+
+type StringHeader struct {
+       Data uintptr
+}
+
+type SliceHeader struct {
+       Data uintptr
+}