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 7package p 8 9import "fmt" 10 11type B struct { 12 x int 13 px *int 14 pb *B 15} 16 17func F1(b *B) { // ERROR "mutates param: b derefs=0" 18 b.x = 1 19} 20 21func F2(b *B) { // ERROR "mutates param: b derefs=1" 22 *b.px = 1 23} 24 25func F2a(b *B) { // ERROR "mutates param: b derefs=0" 26 b.px = nil 27} 28 29func F3(b *B) { // ERROR "leaking param: b" 30 fmt.Println(b) // ERROR "\.\.\. argument does not escape" 31} 32 33func F4(b *B) { // ERROR "leaking param content: b" 34 fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap" 35} 36 37func 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 42func F5(b *B) { // ERROR "leaking param: b" 43 sink = b 44} 45 46func F6(b *B) int { // ERROR "b does not escape, mutate, or call" 47 return b.x 48} 49 50var sink any 51 52func 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 61func g(s string) { // ERROR "s does not escape, mutate, or call" 62 sink = &([]byte(s))[10] // ERROR "\(\[\]byte\)\(s\) escapes to heap" 63} 64 65func 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 69func 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 74func 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} 78