|  | // run | 
|  |  | 
|  | // 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 main | 
|  |  | 
|  | type T struct { | 
|  | s   [1]string | 
|  | pad [16]uintptr | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func f(t *int, p *int) []T { | 
|  | var res []T | 
|  | for { | 
|  | var e *T | 
|  | res = append(res, *e) | 
|  | } | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | defer func() { | 
|  | useStack(100) // force a stack copy | 
|  | // We're expecting a panic. | 
|  | // The bug in this issue causes a throw, which this recover() will not squash. | 
|  | recover() | 
|  | }() | 
|  | junk() // fill the stack with invalid pointers | 
|  | f(nil, nil) | 
|  | } | 
|  |  | 
|  | func useStack(n int) { | 
|  | if n == 0 { | 
|  | return | 
|  | } | 
|  | useStack(n - 1) | 
|  | } | 
|  |  | 
|  | //go:noinline | 
|  | func junk() uintptr { | 
|  | var a [128]uintptr // 1k of bad pointers on the stack | 
|  | for i := range a { | 
|  | a[i] = 0xaa | 
|  | } | 
|  | return a[12] | 
|  | } |