]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: recognize reflect.{Slice,String}Header for -d=checkptr
authorMatthew Dempsky <mdempsky@google.com>
Mon, 21 Oct 2019 19:44:42 +0000 (12:44 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 21 Oct 2019 20:51:06 +0000 (20:51 +0000)
Avoids false positive pointer arithmetic panic.

Fixes #35027.

Change-Id: Idd008caaab25fcf739327ac50a021b835ef13def
Reviewed-on: https://go-review.googlesource.com/c/go/+/202560
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue35027.go [new file with mode: 0644]

index 4f5fa38a334cf8da1cb7b283585bb2c76bbd61f7..8f6da254715fd7eb9de8a82d908e5c18011ed2cc 100644 (file)
@@ -3941,6 +3941,10 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node {
                return n
        }
 
+       if n.Left.Op == ODOTPTR && isReflectHeaderDataField(n.Left) {
+               return n
+       }
+
        // Find original unsafe.Pointer operands involved in this
        // arithmetic expression.
        //
diff --git a/test/fixedbugs/issue35027.go b/test/fixedbugs/issue35027.go
new file mode 100644 (file)
index 0000000..d4b0be5
--- /dev/null
@@ -0,0 +1,23 @@
+// run -gcflags=-d=checkptr
+
+// Copyright 2019 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 main
+
+import (
+       "reflect"
+       "unsafe"
+)
+
+var s []int
+
+func main() {
+       s = []int{42}
+       h := (*reflect.SliceHeader)(unsafe.Pointer(&s))
+       x := *(*int)(unsafe.Pointer(h.Data))
+       if x != 42 {
+               panic(x)
+       }
+}