mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![David Chase](/assets/img/avatar_default.png)
The uintptr-typed Data field in reflect.SliceHeader and reflect.StringHeader needs special treatment because it is really a pointer. Add the special treatment in walk for bug #19168 to escape analysis. Includes extra debugging that was helpful. Fixes #19743. Change-Id: I6dab5002f0d436c3b2a7cdc0156e4fc48a43d6fe Reviewed-on: https://go-review.googlesource.com/38738 Run-TryBot: David Chase <drchase@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
32 lines
757 B
Go
32 lines
757 B
Go
// errorcheck -0 -m -l
|
|
|
|
// Copyright 2017 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
|
|
|
|
// Escape analysis needs to treat the uintptr-typed reflect.*Header fields as pointers.
|
|
|
|
import (
|
|
"reflect"
|
|
"unsafe"
|
|
)
|
|
|
|
type immutableBytes []byte
|
|
|
|
// Bug was failure to leak param b.
|
|
func toString(b immutableBytes) string { // ERROR "leaking param: b$"
|
|
var s string
|
|
if len(b) == 0 {
|
|
return s
|
|
}
|
|
|
|
strHeader := (*reflect.StringHeader)(unsafe.Pointer(&s)) // ERROR "toString &s does not escape$"
|
|
strHeader.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data // ERROR "toString &b does not escape$"
|
|
|
|
l := len(b)
|
|
strHeader.Len = l
|
|
return s
|
|
}
|