| // errorcheck -0 -m -d=escapemutationscalls,zerocopy -l | |
| // Copyright 2023 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 p | |
| import "fmt" | |
| type B struct { | |
| x int | |
| px *int | |
| pb *B | |
| } | |
| func F1(b *B) { // ERROR "mutates param: b derefs=0" | |
| b.x = 1 | |
| } | |
| func F2(b *B) { // ERROR "mutates param: b derefs=1" | |
| *b.px = 1 | |
| } | |
| func F2a(b *B) { // ERROR "mutates param: b derefs=0" | |
| b.px = nil | |
| } | |
| func F3(b *B) { // ERROR "leaking param: b" | |
| fmt.Println(b) // ERROR "\.\.\. argument does not escape" | |
| } | |
| func F4(b *B) { // ERROR "leaking param content: b" | |
| fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap" | |
| } | |
| func F4a(b *B) { // ERROR "leaking param content: b" "mutates param: b derefs=0" | |
| b.x = 2 | |
| fmt.Println(*b) // ERROR "\.\.\. argument does not escape" "\*b escapes to heap" | |
| } | |
| func F5(b *B) { // ERROR "leaking param: b" | |
| sink = b | |
| } | |
| func F6(b *B) int { // ERROR "b does not escape, mutate, or call" | |
| return b.x | |
| } | |
| var sink any | |
| func M() { | |
| var b B // ERROR "moved to heap: b" | |
| F1(&b) | |
| F2(&b) | |
| F2a(&b) | |
| F3(&b) | |
| F4(&b) | |
| } | |
| func g(s string) { // ERROR "s does not escape, mutate, or call" | |
| sink = &([]byte(s))[10] // ERROR "\(\[\]byte\)\(s\) escapes to heap" | |
| } | |
| func h(out []byte, s string) { // ERROR "mutates param: out derefs=0" "s does not escape, mutate, or call" | |
| copy(out, []byte(s)) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape" | |
| } | |
| func i(s string) byte { // ERROR "s does not escape, mutate, or call" | |
| p := []byte(s) // ERROR "zero-copy string->\[\]byte conversion" "\(\[\]byte\)\(s\) does not escape" | |
| return p[20] | |
| } | |
| func j(s string, x byte) { // ERROR "s does not escape, mutate, or call" | |
| p := []byte(s) // ERROR "\(\[\]byte\)\(s\) does not escape" | |
| p[20] = x | |
| } |