mirror of
https://github.com/golang/go
synced 2024-11-18 10:44:45 -07:00
606019cb4b
This information is redundant with the position information already provided. Also, no other -m diagnostics print out function name. While here, report parameter leak diagnostics against the parameter declaration position rather than the function, and use Warnl for "moved to heap" messages. Test cases updated programmatically by removing the first word from every "no match for" error emitted by run.go: go run run.go |& \ sed -E -n 's/^(.*):(.*): no match for `([^ ]* (.*))` in:$/\1!\2!\3!\4/p' | \ while IFS='!' read -r fn line before after; do before=$(echo "$before" | sed 's/[.[\*^$()+?{|]/\\&/g') after=$(echo "$after" | sed -E 's/(\&|\\)/\\&/g') fn=$(find . -name "${fn}" | head -1) sed -i -E -e "${line}s/\"${before}\"/\"${after}\"/" "${fn}" done Passes toolstash-check. Change-Id: I6e02486b1409e4a8dbb2b9b816d22095835426b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/195040 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
58 lines
2.2 KiB
Go
58 lines
2.2 KiB
Go
// +build !gcflags_noopt
|
|
// errorcheck -0 -m
|
|
|
|
// Copyright 2018 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 foo
|
|
|
|
import "bytes"
|
|
|
|
// In order to get desired results, we need a combination of
|
|
// both escape analysis and inlining.
|
|
|
|
func bufferNotEscape() string {
|
|
// b itself does not escape, only its buf field will be
|
|
// copied during String() call, but object "handle" itself
|
|
// can be stack-allocated.
|
|
var b bytes.Buffer
|
|
b.WriteString("123")
|
|
b.Write([]byte{'4'}) // ERROR "\[\]byte literal does not escape$"
|
|
return b.String() // ERROR "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$"
|
|
}
|
|
|
|
func bufferNoEscape2(xs []string) int { // ERROR "xs does not escape$"
|
|
b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$"
|
|
for _, x := range xs {
|
|
b.WriteString(x)
|
|
}
|
|
return b.Len() // ERROR "inlining call to bytes.\(\*Buffer\).Len$"
|
|
}
|
|
|
|
func bufferNoEscape3(xs []string) string { // ERROR "xs does not escape$"
|
|
b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$"
|
|
for _, x := range xs {
|
|
b.WriteString(x)
|
|
b.WriteByte(',')
|
|
}
|
|
return b.String() // ERROR "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$"
|
|
}
|
|
|
|
func bufferNoEscape4() []byte {
|
|
var b bytes.Buffer
|
|
b.Grow(64) // ERROR "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$"
|
|
useBuffer(&b)
|
|
return b.Bytes() // ERROR "inlining call to bytes.\(\*Buffer\).Bytes$"
|
|
}
|
|
|
|
func bufferNoEscape5() { // ERROR "can inline bufferNoEscape5$"
|
|
b := bytes.NewBuffer(make([]byte, 0, 128)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 128\) does not escape$" "inlining call to bytes.NewBuffer$"
|
|
useBuffer(b)
|
|
}
|
|
|
|
//go:noinline
|
|
func useBuffer(b *bytes.Buffer) { // ERROR "b does not escape$"
|
|
b.WriteString("1234")
|
|
}
|