mirror of
https://github.com/golang/go
synced 2024-11-14 13:50:23 -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>
48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
// errorcheck -0 -N -m -l
|
|
|
|
// Copyright 2016 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.
|
|
|
|
// The escape analyzer needs to run till its root set settles
|
|
// (this is not that often, it turns out).
|
|
// This test is likely to become stale because the leak depends
|
|
// on a spurious-escape bug -- return an interface as a named
|
|
// output parameter appears to cause the called closure to escape,
|
|
// where returning it as a regular type does not.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type closure func(i, j int) ent
|
|
|
|
type ent int
|
|
|
|
func (e ent) String() string {
|
|
return fmt.Sprintf("%d", int(e)) // ERROR "... argument does not escape$" "int\(e\) escapes to heap$"
|
|
}
|
|
|
|
//go:noinline
|
|
func foo(ops closure, j int) (err fmt.Stringer) { // ERROR "ops does not escape"
|
|
enqueue := func(i int) fmt.Stringer { // ERROR "func literal does not escape"
|
|
return ops(i, j) // ERROR "ops\(i, j\) escapes to heap$"
|
|
}
|
|
err = enqueue(4)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return // return result of enqueue, a fmt.Stringer
|
|
}
|
|
|
|
func main() {
|
|
// 3 identical functions, to get different escape behavior.
|
|
f := func(i, j int) ent { // ERROR "func literal does not escape"
|
|
return ent(i + j)
|
|
}
|
|
i := foo(f, 3).(ent)
|
|
fmt.Printf("foo(f,3)=%d\n", int(i)) // ERROR "int\(i\) escapes to heap$" "... argument does not escape$"
|
|
}
|