Commit 0d6a0d6c authored by Shenghou Ma's avatar Shenghou Ma Committed by Minux Ma

runtime: don't return a slice with nil ptr but non-zero len from growslice

Fixes #10135.

Change-Id: Ic4c5ab15bcb7b9c3fcc685a788d3b59c60c26e1e
Signed-off-by: 's avatarShenghou Ma <minux@golang.org>
Reviewed-on: https://go-review.googlesource.com/7400Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent 1e1c9dc2
......@@ -50,7 +50,9 @@ func growslice(t *slicetype, old sliceStruct, n int) sliceStruct {
et := t.elem
if et.size == 0 {
return sliceStruct{old.array, old.len, cap}
// append should not create a slice with nil pointer but non-zero len.
// We assume that append doesn't need to preserve old.array in this case.
return sliceStruct{unsafe.Pointer(&zerobase), old.len, cap}
}
newcap := old.cap
......
// run
// Copyright 2015 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.
// Issue 10135: append a slice with zero-sized element used
// to always return a slice with the same data pointer as the
// old slice, even if it's nil, so this program used to panic
// with nil pointer dereference because after append, s is a
// slice with nil data pointer but non-zero len and cap.
package main
type empty struct{}
func main() {
var s []empty
s = append(s, empty{})
for _, v := range s {
_ = v
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment