1
0
mirror of https://github.com/golang/go synced 2024-11-13 18:30:26 -07:00

reflect: make Field panic when out of bounds, as documented

Fixes #15046.

Change-Id: Iba7216297735be8e1ec550ce5336d17dcd3fd6b7
Reviewed-on: https://go-review.googlesource.com/22992
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Emmanuel Odeke 2016-05-10 07:06:47 -07:00 committed by Brad Fitzpatrick
parent 42b647bde6
commit 9edb27e76f
2 changed files with 36 additions and 1 deletions

View File

@ -5221,6 +5221,41 @@ func TestLargeGCProg(t *testing.T) {
fv.Call([]Value{ValueOf([256]*byte{})}) fv.Call([]Value{ValueOf([256]*byte{})})
} }
func fieldIndexRecover(t Type, i int) (recovered interface{}) {
defer func() {
recovered = recover()
}()
t.Field(i)
return
}
// Issue 15046.
func TestTypeFieldOutOfRangePanic(t *testing.T) {
typ := TypeOf(struct{ X int }{10})
testIndices := [...]struct {
i int
mustPanic bool
}{
0: {-2, true},
1: {0, false},
2: {1, true},
3: {1 << 10, true},
}
for i, tt := range testIndices {
recoveredErr := fieldIndexRecover(typ, tt.i)
if tt.mustPanic {
if recoveredErr == nil {
t.Errorf("#%d: fieldIndex %d expected to panic", i, tt.i)
}
} else {
if recoveredErr != nil {
t.Errorf("#%d: got err=%v, expected no panic", i, recoveredErr)
}
}
}
}
// Issue 9179. // Issue 9179.
func TestCallGC(t *testing.T) { func TestCallGC(t *testing.T) {
f := func(a, b, c, d, e string) { f := func(a, b, c, d, e string) {

View File

@ -1178,7 +1178,7 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) {
// Field returns the i'th struct field. // Field returns the i'th struct field.
func (t *structType) Field(i int) (f StructField) { func (t *structType) Field(i int) (f StructField) {
if i < 0 || i >= len(t.fields) { if i < 0 || i >= len(t.fields) {
return panic("reflect: Field index out of bounds")
} }
p := &t.fields[i] p := &t.fields[i]
f.Type = toType(p.typ) f.Type = toType(p.typ)