1
0
mirror of https://github.com/golang/go synced 2024-11-26 02:57:57 -07:00

cmd/compile: increase nesting depth limit for type descriptors

The formatting routines for types use a depth limit as primitive
mechanism to detect cycles. For now, increase the limit from 100
to 250 and file #29312 so we don't drop this on the floor.

Also, adjust some fatal error messages elsewhere to use
better formatting.

Fixes #29264.
Updates #29312.

Change-Id: Idd529f6682d478e0dcd2d469cb802192190602f6
Reviewed-on: https://go-review.googlesource.com/c/154583
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Robert Griesemer 2018-12-17 14:42:29 -08:00
parent 32b879c674
commit 99e4ddd053
4 changed files with 29 additions and 3 deletions

View File

@ -1749,7 +1749,11 @@ func tconv(t *types.Type, flag FmtFlag, mode fmtMode, depth int) string {
return t.FieldType(0).String() + "," + t.FieldType(1).String()
}
if depth > 100 {
// Avoid endless recursion by setting an upper limit. This also
// limits the depths of valid composite types, but they are likely
// artificially created.
// TODO(gri) should have proper cycle detection here, eventually (issue #29312)
if depth > 250 {
return "<...>"
}

View File

@ -1325,7 +1325,7 @@ func (w *exportWriter) expr(n *Node) {
default:
Fatalf("cannot export %v (%d) node\n"+
"==> please file an issue and assign to gri@\n", n.Op, int(n.Op))
"\t==> please file an issue and assign to gri@", n.Op, int(n.Op))
}
}

View File

@ -1053,7 +1053,7 @@ func (r *importReader) node() *Node {
default:
Fatalf("cannot import %v (%d) node\n"+
"==> please file an issue and assign to gri@\n", op, int(op))
"\t==> please file an issue and assign to gri@", op, int(op))
panic("unreachable") // satisfy compiler
}
}

View File

@ -0,0 +1,22 @@
// run
// Copyright 2018 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.
// Verify that we emit a valid type descriptor for
// a fairly deeply nested type.
package main
import "fmt"
import "strings"
func main() {
a := [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]int{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{42}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
got := fmt.Sprint(a)
want := strings.Repeat("[", 100) + "42" + strings.Repeat("]", 100)
if got != want {
fmt.Printf("got %q\nwant %q\n", got, want)
}
}