Skip to content

cmd/compile: byte array fields escape to the heap if they are sliced and passed to copy #19723

@davecheney

Description

@davecheney

Please answer these questions before submitting your issue. Thanks!

What version of Go are you using (go version)?

go version devel +4909ecc Sun Mar 26 21:29:31 2017 +0000 linux/amd64

What operating system and processor architecture are you using (go env)?

linux/amd64

What did you do?

package main

type Buf struct {
	buf [100]byte
	off int
}

// Insert inserts b at offset i.
func (a *Buf) Insert(i int, b byte) {
	a.off++
	copy(a.buf[i+1:a.off], a.buf[i:a.off-1])
	a.buf[i] = b
}

func main() {
	var a Buf
	a.Insert(0, 1)
}

What did you expect to see?

a does not escape to the heap

What did you see instead?

./escape.go:9:31: leaking param content: a
./escape.go:9:31: 	from a.buf (dot of pointer) at ./escape.go:11:26
./escape.go:9:31: 	from a.buf (address-of) at ./escape.go:11:30
./escape.go:9:31: 	from a.buf[i:a.off - 1] (slice) at ./escape.go:11:30
./escape.go:9:31: 	from *a.buf[i:a.off - 1] (indirection) at ./escape.go:11:30
./escape.go:9:31: 	from copy(a.buf[i + 1:a.off], a.buf[i:a.off - 1]) (copied slice) at ./escape.go:11:6

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions