mirror of https://go.googlesource.com/go
78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
// 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
|
|
}
|