1
0
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:
Dmitry Vyukov 2015-04-14 12:46:15 +03:00
parent 3b22ffc07e
commit 24f246c1b6
2 changed files with 18 additions and 0 deletions

View File

@ -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

View 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
}