github.com/go-darwin/sys@v0.0.0-20220510002607-68fd01f054ca/testdata/testprog/crash.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"runtime"
    10  )
    11  
    12  func init() {
    13  	register("Crash", Crash)
    14  	register("DoublePanic", DoublePanic)
    15  }
    16  
    17  func test(name string) {
    18  	defer func() {
    19  		if x := recover(); x != nil {
    20  			fmt.Printf(" recovered")
    21  		}
    22  		fmt.Printf(" done\n")
    23  	}()
    24  	fmt.Printf("%s:", name)
    25  	var s *string
    26  	_ = *s
    27  	fmt.Print("SHOULD NOT BE HERE")
    28  }
    29  
    30  func testInNewThread(name string) {
    31  	c := make(chan bool)
    32  	go func() {
    33  		runtime.LockOSThread()
    34  		test(name)
    35  		c <- true
    36  	}()
    37  	<-c
    38  }
    39  
    40  func Crash() {
    41  	runtime.LockOSThread()
    42  	test("main")
    43  	testInNewThread("new-thread")
    44  	testInNewThread("second-new-thread")
    45  	test("main-again")
    46  }
    47  
    48  type P string
    49  
    50  func (p P) String() string {
    51  	// Try to free the "YYY" string header when the "XXX"
    52  	// panic is stringified.
    53  	runtime.GC()
    54  	runtime.GC()
    55  	runtime.GC()
    56  	return string(p)
    57  }
    58  
    59  // Test that panic message is not clobbered.
    60  // See issue 30150.
    61  func DoublePanic() {
    62  	defer func() {
    63  		panic(P("YYY"))
    64  	}()
    65  	panic(P("XXX"))
    66  }