1 // run 2 3 // Copyright 2014 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 package main 8 9 import ( 10 "runtime" 11 "time" 12 ) 13 14 func main() { 15 c := make(chan bool, 1) 16 go f1(c) 17 <-c 18 time.Sleep(10 * time.Millisecond) 19 go f2(c) 20 <-c 21 } 22 23 func f1(done chan bool) { 24 defer func() { 25 recover() 26 done <- true 27 runtime.Goexit() // left stack-allocated Panic struct on gp->panic stack 28 }() 29 panic("p") 30 } 31 32 func f2(done chan bool) { 33 defer func() { 34 recover() 35 done <- true 36 runtime.Goexit() 37 }() 38 time.Sleep(10 * time.Millisecond) // overwrote Panic struct with Timer struct 39 runtime.GC() // walked gp->panic list, found mangled Panic struct, crashed 40 panic("p") 41 } 42