Source file
test/fixedbugs/issue80004.go
1
2
3
4
5
6
7 package main
8
9 import (
10 "runtime"
11 "unsafe"
12 )
13
14
15
16
17
18
19 type E struct {
20 a [7]*byte
21 }
22
23
24
25
26 type Victim struct {
27 a uintptr
28 b [6]int32
29 c *byte
30 }
31
32
33 func f(n int) []E {
34 var r []E
35 for range n {
36 r = append(r, E{})
37 }
38 return r
39 }
40
41
42 func newVictim() *Victim {
43 return &Victim{a: badPtr}
44 }
45
46 var badPtr uintptr
47
48 func init() {
49 x := make([]byte, 1<<18-8)
50 sink = &x[0]
51 badPtr = uintptr(unsafe.Pointer(&x[len(x)-1])) + 5
52 }
53
54 func main() {
55 fs := make([]*Victim, 1000)
56
57
58 for i := range fs {
59 fs[i] = newVictim()
60 }
61
62 for i := range fs {
63 if i%2 == 1 {
64 fs[i] = nil
65 }
66 }
67 runtime.GC()
68
69
70
71
72
73 for range len(fs) / 2 {
74 _ = f(1)
75 }
76 runtime.GC()
77
78
79 sink = &fs[0]
80 }
81
82 var sink any
83
View as plain text