]> Cypherpunks.ru repositories - gostls13.git/blob - test/escape_mutations.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / escape_mutations.go
1 // errorcheck -0 -m -d=escapemutationscalls,zerocopy -l
2
3 // Copyright 2023 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 p
8
9 import "fmt"
10
11 type B struct {
12         x  int
13         px *int
14         pb *B
15 }
16
17 func F1(b *B) { // ERROR "mutates param: b derefs=0"
18         b.x = 1
19 }
20
21 func F2(b *B) { // ERROR "mutates param: b derefs=1"
22         *b.px = 1
23 }
24
25 func F2a(b *B) { // ERROR "mutates param: b derefs=0"
26         b.px = nil
27 }
28
29 func F3(b *B) { // ERROR "leaking param: b"
30         fmt.Println(b) // ERROR "\.\.\. argument does not escape"
31 }
32
33 func F4(b *B) { // ERROR "leaking param content: b"
34         fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap"
35 }
36
37 func F4a(b *B) { // ERROR "leaking param content: b" "mutates param: b derefs=0"
38         b.x = 2
39         fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap"
40 }
41
42 func F5(b *B) { // ERROR "leaking param: b"
43         sink = b
44 }
45
46 func F6(b *B) int { // ERROR "b does not escape, mutate, or call"
47         return b.x
48 }
49
50 var sink any
51
52 func M() {
53         var b B // ERROR "moved to heap: b"
54         F1(&b)
55         F2(&b)
56         F2a(&b)
57         F3(&b)
58         F4(&b)
59 }
60
61 func g(s string) { // ERROR "s does not escape, mutate, or call"
62         sink = &([]byte(s))[10] // ERROR "\(\[\]byte\)\(s\) escapes to heap"
63 }
64
65 func h(out []byte, s string) { // ERROR "mutates param: out derefs=0" "s does not escape, mutate, or call"
66         copy(out, []byte(s)) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape"
67 }
68
69 func i(s string) byte { // ERROR "s does not escape, mutate, or call"
70         p := []byte(s) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape"
71         return p[20]
72 }
73
74 func j(s string, x byte) { // ERROR "s does not escape, mutate, or call"
75         p := []byte(s) // ERROR "\(\[\]byte\)\(s\) does not escape"
76         p[20] = x
77 }