Commit 316ac4f3 authored by Keith Randall's avatar Keith Randall Committed by Keith Randall

cmd/compile: fix crash on write barrier insertion

The compiler can crash if the compiled code tries to
unconditionally read from a nil pointer. This should cause
the generated binary to panic, not the compiler.

Fixes #33438

Change-Id: Ic8fa89646d6968e2cc4e27da0ad9286662f8bc49
Reviewed-on: https://go-review.googlesource.com/c/go/+/188760Reviewed-by: default avatarAustin Clements <austin@google.com>
parent bdea352b
......@@ -520,6 +520,10 @@ func IsReadOnlyGlobalAddr(v *Value) bool {
if !IsGlobalAddr(v) {
return false
}
if v.Op == OpConst64 || v.Op == OpConst32 {
// Nil pointers are read only. See issue 33438.
return true
}
// See TODO in OpAddr case in IsSanitizerSafeAddr below.
return strings.HasPrefix(v.Aux.(*obj.LSym).Name, `""..stmp_`)
}
......
// compile
// 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
type hasPtrs struct {
x [2]*int
// Note: array size needs to be >1 to force this type to be not SSAable.
// The bug triggers only for OpMove, which is only used for unSSAable types.
}
func main() {
var x *hasPtrs // Can be local, global, or arg; nil or non-nil.
var y *hasPtrs = nil // Must initialize to nil.
*x = *y
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment