Skip to content

Commit

Permalink
cmd/compile: fix -d=checkptr for named unsafe.Pointer types
Browse files Browse the repository at this point in the history
We need to explicitly convert pointers to unsafe.Pointer before
passing to the runtime checkptr instrumentation in case the user
declared their own type with underlying type unsafe.Pointer.

Updates #22218.
Fixes #34966.

Change-Id: I3baa2809d77f8257167cd78f57156f819130baa8
Reviewed-on: https://go-review.googlesource.com/c/go/+/201782
Run-TryBot: Matthew Dempsky <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Keith Randall <[email protected]>
  • Loading branch information
mdempsky committed Oct 17, 2019
1 parent 58e8f78 commit f922645
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
9 changes: 6 additions & 3 deletions src/cmd/compile/internal/gc/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -2392,6 +2392,9 @@ func conv(n *Node, t *types.Type) *Node {
// convnop converts node n to type t using the OCONVNOP op
// and typechecks the result with ctxExpr.
func convnop(n *Node, t *types.Type) *Node {
if types.Identical(n.Type, t) {
return n
}
n = nod(OCONVNOP, n, nil)
n.Type = t
n = typecheck(n, ctxExpr)
Expand Down Expand Up @@ -3915,7 +3918,7 @@ func walkCheckPtrAlignment(n *Node, init *Nodes) *Node {
}

n.Left = cheapexpr(n.Left, init)
init.Append(mkcall("checkptrAlignment", nil, init, n.Left, typename(n.Type.Elem())))
init.Append(mkcall("checkptrAlignment", nil, init, convnop(n.Left, types.Types[TUNSAFEPTR]), typename(n.Type.Elem())))
return n
}

Expand Down Expand Up @@ -3956,7 +3959,7 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node {
case OCONVNOP:
if n.Left.Type.Etype == TUNSAFEPTR {
n.Left = cheapexpr(n.Left, init)
originals = append(originals, n.Left)
originals = append(originals, convnop(n.Left, types.Types[TUNSAFEPTR]))
}
}
}
Expand All @@ -3968,7 +3971,7 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node {
slice.Esc = EscNone
slice.SetTransient(true)

init.Append(mkcall("checkptrArithmetic", nil, init, n, slice))
init.Append(mkcall("checkptrArithmetic", nil, init, convnop(n, types.Types[TUNSAFEPTR]), slice))
return n
}

Expand Down
14 changes: 14 additions & 0 deletions test/fixedbugs/issue34966.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// compile -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 p

import "unsafe"

type ptr unsafe.Pointer

func f(p ptr) *int { return (*int)(p) }
func g(p ptr) ptr { return ptr(uintptr(p) + 1) }

0 comments on commit f922645

Please sign in to comment.