-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Closed
Labels
FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.The path to resolution is known, but the work has not been done.
Milestone
Description
What version of Go are you using (go version
)?
$ go version go version go1.17 linux/amd64
Does this issue reproduce with the latest release?
Yes.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/lorenz/.cache/go-build" GOENV="/home/lorenz/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/lorenz/go/pkg/mod" GONOPROXY="code.cfops.it" GONOSUMDB="code.cfops.it" GOOS="linux" GOPATH="/home/lorenz/go" GOPRIVATE="code.cfops.it" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.17" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/lorenz/dev/tubular/go.mod" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1004726008=/tmp/go-build -gno-record-gcc-switches" GOROOT/bin/go version: go version go1.17 linux/amd64 GOROOT/bin/go tool compile -V: compile version go1.17 uname -sr: Linux 5.11.0-31-generic Distributor ID: Ubuntu Description: Ubuntu 21.04 Release: 21.04 Codename: hirsute /lib/x86_64-linux-gnu/libc.so.6: GNU C Library (Ubuntu GLIBC 2.33-0ubuntu5) release release version 2.33. gdb --version: GNU gdb (Ubuntu 10.1-2ubuntu2) 10.1.90.20210411-git
What did you do?
Compiling our internal codebase with go 1.17 aborts with a panic. Based on the stack trace the problem seems to originate in escape analysis.
$ go build -gcflags '-m' ./cmd/...
# code.cfops.it/sys/tubular/cmd/tubectl
cmd/tubectl/flags.go:76:16: inlining call to flag.(*FlagSet).Output
cmd/tubectl/flags.go:86:51: inlining call to flag.(*FlagSet).Name
cmd/tubectl/flags.go:23:24: inlining call to flag.NewFlagSet
cmd/tubectl/flags.go:24:15: inlining call to flag.(*FlagSet).SetOutput
cmd/tubectl/flags.go:48:28: inlining call to flag.(*FlagSet).Output
cmd/tubectl/main.go:94:6: can inline (*env).newFlagSet
cmd/tubectl/flags.go:67:17: inlining call to flag.(*FlagSet).NArg
cmd/tubectl/main.go:50:37: inlining call to cap.GetProc
cmd/tubectl/binding.go:14:21: inlining call to (*env).newFlagSet
cmd/tubectl/binding.go:26:39: inlining call to flag.(*FlagSet).Args
cmd/tubectl/binding.go:41:21: inlining call to (*env).newFlagSet
cmd/tubectl/binding.go:47:39: inlining call to flag.(*FlagSet).Args
cmd/tubectl/flags.go:91:26: inlining call to flag.(*FlagSet).Output
cmd/tubectl/binding.go:147:22: inlining call to os.Open
cmd/tubectl/binding.go:154:28: inlining call to json.NewDecoder
cmd/tubectl/binding.go:155:31: inlining call to json.(*Decoder).DisallowUnknownFields
cmd/tubectl/binding.go:157:45: inlining call to os.(*File).Name
cmd/tubectl/binding.go:169:33: inlining call to netaddr.IPPrefix.Masked
cmd/tubectl/binding.go:175:33: inlining call to netaddr.IPPrefix.Masked
cmd/tubectl/binding.go:126:13: inlining call to flag.(*FlagSet).NArg
cmd/tubectl/binding.go:131:37: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/binding.go:105:38: inlining call to netaddr.MustParseIPPrefix
cmd/tubectl/loading.go:10:21: inlining call to (*env).newFlagSet
cmd/tubectl/loading.go:30:21: inlining call to (*env).newFlagSet
cmd/tubectl/loading.go:49:21: inlining call to (*env).newFlagSet
cmd/tubectl/loading.go:59:39: inlining call to "code.cfops.it/sys/tubular/internal".UpgradeDispatcher
cmd/tubectl/main.go:123:24: inlining call to flag.NewFlagSet
cmd/tubectl/main.go:124:15: inlining call to flag.(*FlagSet).SetOutput
cmd/tubectl/main.go:125:15: inlining call to flag.(*FlagSet).StringVar
cmd/tubectl/main.go:125:15: inlining call to flag.newStringValue
cmd/tubectl/main.go:126:15: inlining call to flag.(*FlagSet).StringVar
cmd/tubectl/main.go:126:15: inlining call to flag.newStringValue
cmd/tubectl/main.go:157:13: inlining call to flag.(*FlagSet).NArg
cmd/tubectl/main.go:163:20: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/main.go:164:21: inlining call to flag.(*FlagSet).Args
cmd/tubectl/main.go:117:8: can inline tubectl.func1
cmd/tubectl/main.go:129:20: inlining call to flag.(*FlagSet).Output
cmd/tubectl/main.go:130:83: inlining call to flag.(*FlagSet).Name
cmd/tubectl/register.go:222:21: inlining call to unix.Stat
cmd/tubectl/register.go:227:21: inlining call to unix.Stat
cmd/tubectl/register.go:233:20: inlining call to errors.New
cmd/tubectl/register.go:197:14: inlining call to os.(*File).Close
cmd/tubectl/register.go:200:14: inlining call to os.(*File).Close
cmd/tubectl/register.go:179:11: inlining call to os.(*File).Close
cmd/tubectl/register.go:211:38: inlining call to unix.GetsockoptUint64
cmd/tubectl/register.go:156:58: inlining call to "code.cfops.it/sys/tubular/internal".(*Destination).String
cmd/tubectl/register.go:158:58: inlining call to "code.cfops.it/sys/tubular/internal".(*Destination).String
cmd/tubectl/register.go:25:21: inlining call to (*env).newFlagSet
cmd/tubectl/register.go:43:66: inlining call to os.Getpid
cmd/tubectl/register.go:43:66: inlining call to syscall.Getpid
cmd/tubectl/register.go:43:81: inlining call to unix.Gettid
cmd/tubectl/register.go:48:18: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:57:11: inlining call to os.(*File).Close
cmd/tubectl/register.go:65:21: inlining call to (*env).newFlagSet
cmd/tubectl/register.go:83:38: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:85:45: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:85:37: inlining call to ioutil.ReadFile
cmd/tubectl/register.go:91:50: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:98:18: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:99:21: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:101:36: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:103:49: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:106:40: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:108:51: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/register.go:124:11: inlining call to os.(*File).Close
cmd/tubectl/status.go:108:20: can inline sortDestinations.func1
cmd/tubectl/status.go:23:21: inlining call to (*env).newFlagSet
cmd/tubectl/status.go:43:18: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/status.go:45:26: inlining call to tabwriter.NewWriter
cmd/tubectl/status.go:60:19: inlining call to tabwriter.(*Writer).Flush
cmd/tubectl/status.go:92:27: inlining call to "code.cfops.it/sys/tubular/internal".(*DestinationMetrics).TotalErrors
cmd/tubectl/status.go:100:19: inlining call to tabwriter.(*Writer).Flush
cmd/tubectl/status.go:199:31: inlining call to prometheus.NewRegistry
cmd/tubectl/status.go:200:51: inlining call to prometheus.WrapRegistererWithPrefix
cmd/tubectl/status.go:218:32: inlining call to runtime.Version
cmd/tubectl/status.go:239:16: can inline metricsServer.func1
cmd/tubectl/status.go:123:21: inlining call to (*env).newFlagSet
cmd/tubectl/status.go:140:20: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/status.go:141:17: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/status.go:142:25: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/status.go:154:67: inlining call to os.Getpid
cmd/tubectl/status.go:154:67: inlining call to syscall.Getpid
cmd/tubectl/status.go:154:82: inlining call to unix.Gettid
cmd/tubectl/unregister.go:10:21: inlining call to (*env).newFlagSet
cmd/tubectl/unregister.go:19:18: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/unregister.go:22:47: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/unregister.go:27:46: inlining call to flag.(*FlagSet).Arg
cmd/tubectl/unregister.go:38:87: inlining call to "code.cfops.it/sys/tubular/internal".Domain.String
cmd/tubectl/unregister.go:38:103: inlining call to "code.cfops.it/sys/tubular/internal".Protocol.String
cmd/tubectl/version.go:11:21: inlining call to (*env).newFlagSet
cmd/tubectl/version.go:17:81: inlining call to runtime.Version
cmd/tubectl/main.go:36:28: inlining call to "code.cfops.it/sys/tubular/internal/log".NewStdLogger
cmd/tubectl/main.go:36:28: inlining call to "log".New
cmd/tubectl/main.go:37:28: inlining call to "code.cfops.it/sys/tubular/internal/log".NewStdLogger
cmd/tubectl/main.go:37:28: inlining call to "log".New
cmd/tubectl/main.go:38:30: inlining call to context.Background
cmd/tubectl/status.go:203:31: devirtualizing tubularReg.Register to *prometheus.wrappingRegisterer
cmd/tubectl/status.go:209:32: devirtualizing tubularReg.Register to *prometheus.wrappingRegisterer
cmd/tubectl/flags.go:75:7: leaking param content: fs
cmd/tubectl/flags.go:80:21: ... argument does not escape
cmd/tubectl/flags.go:80:43: strings.Join(fs.args, "> <") escapes to heap
cmd/tubectl/flags.go:83:22: ... argument does not escape
cmd/tubectl/flags.go:83:46: strings.Join(fs.optionalArgs, ">] [<") escapes to heap
cmd/tubectl/flags.go:86:13: ... argument does not escape
cmd/tubectl/flags.go:86:51: string(~R0) escapes to heap
cmd/tubectl/flags.go:86:51: args escapes to heap
cmd/tubectl/flags.go:101:30: leaking param: s
cmd/tubectl/flags.go:22:17: leaking param: output
cmd/tubectl/flags.go:22:35: leaking param: name
cmd/tubectl/flags.go:22:48: leaking param: args
cmd/tubectl/flags.go:23:24: &flag.FlagSet{...} escapes to heap
cmd/tubectl/flags.go:23:24: flag.f.defaultUsage escapes to heap
cmd/tubectl/flags.go:35:8: &flagSet{...} escapes to heap
cmd/tubectl/flags.go:42:13: func literal escapes to heap
cmd/tubectl/flags.go:48:58: trimLeadingTabsAndSpace(v) + "\n\n" escapes to heap
cmd/tubectl/flags.go:52:9: "unsupported type" escapes to heap
cmd/tubectl/flags.go:60:7: leaking param content: fs
cmd/tubectl/flags.go:60:26: leaking param: args
cmd/tubectl/flags.go:72:2: errBadArg escapes to heap
cmd/tubectl/binding.go:66:22: leaking param content: args
cmd/tubectl/binding.go:68:25: ... argument does not escape
cmd/tubectl/binding.go:68:26: n escapes to heap
cmd/tubectl/binding.go:78:25: ... argument does not escape
cmd/tubectl/binding.go:78:68: args[1] escapes to heap
cmd/tubectl/binding.go:83:25: ... argument does not escape
cmd/tubectl/main.go:49:7: e does not escape
cmd/tubectl/main.go:52:20: ... argument does not escape
cmd/tubectl/main.go:59:21: ... argument does not escape
cmd/tubectl/main.go:80:7: leaking param content: e
cmd/tubectl/main.go:87:25: ... argument does not escape
cmd/tubectl/main.go:90:15: ... argument escapes to heap
cmd/tubectl/main.go:90:47: dp.Path escapes to heap
cmd/tubectl/binding.go:13:11: leaking param content: e
cmd/tubectl/binding.go:13:19: leaking param: args
cmd/tubectl/binding.go:14:21: []string{...} escapes to heap
cmd/tubectl/binding.go:15:18: "\n\t\tBind a given prefix, port and protocol to a label.\n\n\t\tExam... escapes to heap
cmd/tubectl/binding.go:40:13: leaking param content: e
cmd/tubectl/binding.go:40:21: leaking param: args
cmd/tubectl/binding.go:41:21: []string{...} escapes to heap
cmd/tubectl/binding.go:42:18: "Remove a previously created binding." escapes to heap
cmd/tubectl/binding.go:62:14: ... argument escapes to heap
cmd/tubectl/binding.go:62:15: "Removed" escapes to heap
cmd/tubectl/flags.go:89:7: leaking param content: fs
cmd/tubectl/flags.go:89:27: format does not escape
cmd/tubectl/flags.go:89:42: leaking param content: args
cmd/tubectl/flags.go:91:60: trimLeadingTabsAndSpace(usage) + "\n" escapes to heap
cmd/tubectl/binding.go:146:17: leaking param: path
cmd/tubectl/binding.go:153:6: moved to heap: config
cmd/tubectl/binding.go:154:28: &json.Decoder{...} escapes to heap
cmd/tubectl/binding.go:157:25: ... argument does not escape
cmd/tubectl/binding.go:157:45: string(~R0) escapes to heap
cmd/tubectl/binding.go:163:26: ... argument does not escape
cmd/tubectl/binding.go:163:27: bind escapes to heap
cmd/tubectl/binding.go:167:4: &"code.cfops.it/sys/tubular/internal".Binding{...} escapes to heap
cmd/tubectl/binding.go:173:4: &"code.cfops.it/sys/tubular/internal".Binding{...} escapes to heap
cmd/tubectl/binding.go:99:19: leaking param content: e
cmd/tubectl/binding.go:99:27: leaking param: args
cmd/tubectl/binding.go:102:3: moved to heap: port
cmd/tubectl/binding.go:100:19: ... argument escapes to heap
cmd/tubectl/binding.go:101:20: func literal escapes to heap
cmd/tubectl/binding.go:104:27: []bindingJSON{...} escapes to heap
cmd/tubectl/binding.go:109:31: example escapes to heap
cmd/tubectl/binding.go:111:13: ... argument does not escape
cmd/tubectl/binding.go:118:10: string(out) escapes to heap
cmd/tubectl/binding.go:118:10: string(out) escapes to heap
cmd/tubectl/binding.go:128:3: errBadArg escapes to heap
cmd/tubectl/main.go:66:7: leaking param content: e
cmd/tubectl/main.go:73:25: ... argument does not escape
cmd/tubectl/main.go:76:15: ... argument escapes to heap
cmd/tubectl/main.go:76:48: dp.Path escapes to heap
cmd/tubectl/loading.go:9:11: leaking param content: e
cmd/tubectl/loading.go:9:19: leaking param: args
cmd/tubectl/loading.go:11:18: "Load the tubular dispatcher." escapes to heap
cmd/tubectl/loading.go:18:15: ... argument escapes to heap
cmd/tubectl/loading.go:18:16: "dispatcher is already loaded in" escapes to heap
cmd/tubectl/loading.go:18:52: e.netns escapes to heap
cmd/tubectl/loading.go:25:15: ... argument escapes to heap
cmd/tubectl/loading.go:25:48: e.netns escapes to heap
cmd/tubectl/loading.go:29:13: leaking param content: e
cmd/tubectl/loading.go:29:21: leaking param: args
cmd/tubectl/loading.go:31:18: "Unload the tubular dispatcher, removing any present state." escapes to heap
cmd/tubectl/loading.go:38:15: ... argument escapes to heap
cmd/tubectl/loading.go:38:16: "dispatcher is not loaded in" escapes to heap
cmd/tubectl/loading.go:38:48: e.netns escapes to heap
cmd/tubectl/loading.go:44:15: ... argument escapes to heap
cmd/tubectl/loading.go:44:50: e.netns escapes to heap
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x5baad9]
goroutine 1 [running]:
cmd/compile/internal/ir.MethodExprName(...)
/usr/local/go/src/cmd/compile/internal/ir/expr.go:1067
cmd/compile/internal/ir.(*bottomUpVisitor).visit.func2({0xe4ed88, 0xc000dd8360})
/usr/local/go/src/cmd/compile/internal/ir/scc.go:94 +0xd9
cmd/compile/internal/ir.Visit.func1({0xe4ed88, 0xc000dd8360})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:105 +0x30
cmd/compile/internal/ir.doNodes({0xc000dcb740, 0x3, 0xe4e748}, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*CallExpr).doChildren(0xc000350120, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:263 +0x85
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4d2f8, 0xc000350120})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes({0xc000de0030, 0x1, 0xc000dde000}, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*AssignListStmt).doChildren(0xc000dd8540, 0xc000dd8540)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:100 +0x7f
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4cd80, 0xc000dd8540})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes({0xc0003501b0, 0x9, 0xe4e748}, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*ConvExpr).doChildren(0xc000dd5ea0, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:434 +0x3c
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4d870, 0xc000dd5ea0})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes({0xc000dda820, 0x2, 0x1}, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*AssignListStmt).doChildren(0xc000603860, 0xc000603860)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:100 +0x7f
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4cd80, 0xc000603860})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes({0xc000509400, 0x8, 0x0}, 0xc000e4db60)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*Func).doChildren(0xe4dac8, 0xc00049f4a0)
/usr/local/go/src/cmd/compile/internal/ir/func.go:151 +0x2e
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4dac8, 0xc00049f4a0})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.Visit({0xe4dac8, 0xc00049f4a0}, 0xc000e5a900)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:108 +0xb8
cmd/compile/internal/ir.(*bottomUpVisitor).visit(0xc000e40690, 0xc00049f4a0)
/usr/local/go/src/cmd/compile/internal/ir/scc.go:87 +0x1b3
cmd/compile/internal/ir.VisitFuncsBottomUp({0xc000438700, 0x38, 0x2}, 0xd16550)
/usr/local/go/src/cmd/compile/internal/ir/scc.go:60 +0x105
cmd/compile/internal/escape.Funcs(...)
/usr/local/go/src/cmd/compile/internal/escape/escape.go:1821
cmd/compile/internal/gc.Main(0xd16450)
/usr/local/go/src/cmd/compile/internal/gc/main.go:253 +0xcef
main.main()
/usr/local/go/src/cmd/compile/main.go:55 +0xdd
I can't share the full source, but this is the bit that escape analysis was working on as it crashed:
e.stdout.Logf("unloaded dispatcher from %s\n", e.netns) # loading.go:44
return nil
}
func upgrade(e *env, args ...string) error {
set := e.newFlagSet("upgrade")
set.Description = "Upgrade the tubular dispatcher, while preserving present state."
if err := set.Parse(args); err != nil {
return err
}
env
is simply a type struct
containing some string
, interfaces and function pointers.
Metadata
Metadata
Assignees
Labels
FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.The path to resolution is known, but the work has not been done.