diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index 82d232f940..9746fbd316 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -3206,6 +3206,11 @@ func (s *state) exprCheckPtr(n ir.Node, checkPtrOK bool) *ssa.Value { n := n.(*ir.BinaryExpr) ptr := s.expr(n.X) len := s.expr(n.Y) + + // Force len to uintptr to prevent misuse of garbage bits in the + // upper part of the register (#48536). + len = s.conv(n, len, len.Type, types.Types[types.TUINTPTR]) + return s.newValue2(ssa.OpAddPtr, n.Type(), ptr, len) default: diff --git a/test/fixedbugs/issue48536.go b/test/fixedbugs/issue48536.go new file mode 100644 index 0000000000..68c7d1c261 --- /dev/null +++ b/test/fixedbugs/issue48536.go @@ -0,0 +1,29 @@ +// run + +// Copyright 2021 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 "unsafe" + +var i = 257 + +func main() { + var buf [10]byte + p0 := unsafe.Pointer(&buf[0]) + p1 := unsafe.Pointer(&buf[1]) + + if p := unsafe.Add(p0, uint8(i)); p != p1 { + println("FAIL:", p, "!=", p1) + } + + var x uint8 + if i != 0 { + x = 1 + } + if p := unsafe.Add(p0, x); p != p1 { + println("FAIL:", p, "!=", p1) + } +}