mirror of
https://github.com/golang/go
synced 2024-11-12 01:00:22 -07:00
cmd/gc: fix crash during escape analysis
Fixes #10441 Compiler crashed as: panic: runtime error: invalid memory address or nil pointer dereference goroutine 1 [running]: cmd/internal/gc.haspointers(0x0, 0xffffffffffffffff) src/cmd/internal/gc/reflect.go:623 +0x1f cmd/internal/gc.escwalk(0x20c82dc00, 0xffffffffffffffff, 0x20c82dda0, 0x20c835520) src/cmd/internal/gc/esc.go:1291 +0x14aa cmd/internal/gc.escwalk(0x20c82dc00, 0xffffffffffffffff, 0x20c82dda0, 0x20beac340) src/cmd/internal/gc/esc.go:1386 +0x836 while evaluating haspointers of the fake OADDR node here: leaks = level <= 0 && dst.Escloopdepth < src.Escloopdepth || level < 0 && dst == &e.funcParam && haspointers(src.Type) Change-Id: I13c23fced52e8fcd0ae1df81b374df8632eb7790 Reviewed-on: https://go-review.googlesource.com/8932 Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Dmitry Vyukov <dvyukov@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
3b22ffc07e
commit
24f246c1b6
@ -885,6 +885,7 @@ func escassign(e *EscState, dst *Node, src *Node) {
|
||||
a := Nod(OADDR, src, nil)
|
||||
a.Lineno = src.Lineno
|
||||
a.Escloopdepth = src.Escloopdepth
|
||||
a.Type = Ptrto(src.Type)
|
||||
escflows(e, dst, a)
|
||||
|
||||
// Flowing multiple returns to a single dst happens when
|
||||
|
17
test/fixedbugs/issue10441.go
Normal file
17
test/fixedbugs/issue10441.go
Normal file
@ -0,0 +1,17 @@
|
||||
// build
|
||||
|
||||
// Copyright 2015 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
|
||||
|
||||
func bar() {
|
||||
f := func() {}
|
||||
foo(&f)
|
||||
}
|
||||
|
||||
func foo(f *func()) func() {
|
||||
defer func() {}() // prevent inlining of foo
|
||||
return *f
|
||||
}
|
Loading…
Reference in New Issue
Block a user