mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
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/+/188760 Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
bdea352b96
commit
316ac4f330
@ -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_`)
|
||||
}
|
||||
|
19
test/fixedbugs/issue33438.go
Normal file
19
test/fixedbugs/issue33438.go
Normal file
@ -0,0 +1,19 @@
|
||||
// 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user