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:
parent
32b879c674
commit
99e4ddd053
@ -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 "<...>"
|
||||
}
|
||||
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
22
test/fixedbugs/issue29264.go
Normal file
22
test/fixedbugs/issue29264.go
Normal 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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user