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

Fixes #10135.

Change-Id: Ic4c5ab15bcb7b9c3fcc685a788d3b59c60c26e1e
Signed-off-by: Shenghou Ma <minux@golang.org>
Reviewed-on: https://go-review.googlesource.com/7400
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Shenghou Ma 2015-03-11 12:07:50 -04:00 committed by Minux Ma
parent 1e1c9dc2c8
commit 0d6a0d6c3f
2 changed files with 28 additions and 1 deletions

View file

@ -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

View file

@ -0,0 +1,25 @@
// 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
}
}